• BeginPaint 和 GetDC 的一个区别


    这个问题是在做9*9乘法表这个课后习题发现的~~

    先给出我的结论:注意在 WM_PAINT 下不要使用hdc = GetDC(hwnd)的方式,因为这样会不停的触发WM_PAINT消息!

    东西看上去就会闪烁!!

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
            HDC hdc;
            PAINTSTRUCT ps;
            RECT rect;
            int i,j=1,x,y = 0;
            TCHAR szBuffer[20];
            int xpos=100,ypos=100;
            switch (message)
            {
            case WM_PAINT://写在WM_PAINT里九九乘法表会闪烁,貌似一直都会有重绘消息产生!!!!
                    hdc = BeginPaint(hwnd, &ps);
                    wsprintf(szBuffer,TEXT("九九乘法表"));
                    TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
                    ypos += 20;
                    GetClientRect(hwnd,&rect);
                    for (i = 1; i <= 9; i++)
                    {
                            x = i;
                            for (j = 1; j <= i; j++)
                            {
                                    y = j;
                                    wsprintf(szBuffer,TEXT("%d * %d = %d"),x,y,x*y);
                                    TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
                                    xpos += 100;
                            }
                            xpos = 100;
                            ypos += 20;
                    }
                    EndPaint(hwnd,&ps);
                    return 0;
            
            case WM_LBUTTONDOWN:
                    
                    return 0;
    
            case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
            }
    
            return DefWindowProc(hwnd, message, wParam, lParam);
    }

    2、采用 GetDC 的方式,“九九乘法表”会闪烁,貌似一直都会有重绘消息产生!!!!

    //显示9*9乘法表,写在WM_PAINT里九九乘法表会闪烁,貌似一直都会有重绘消息产生!!!!
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
            HDC hdc;
            PAINTSTRUCT ps;
            RECT rect;
            int i,j=1,x,y = 0;
            TCHAR szBuffer[20];
            int xpos=100,ypos=100;
            switch (message)
            {
            case WM_PAINT:
                    hdc = GetDC(hwnd);
                    wsprintf(szBuffer,TEXT("九九乘法表"));
                    TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
                    ypos += 20;
                    GetClientRect(hwnd,&rect);
                    for (i = 1; i <= 9; i++)
                    {
                            x = i;
                            for (j = 1; j <= i; j++)
                            {
                                    y = j;
                                    wsprintf(szBuffer,TEXT("%d * %d = %d"),x,y,x*y);
                                    TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
                                    xpos += 100;
                            }
                            xpos = 100;
                            ypos += 20;
                    }
                    ReleaseDC(hwnd,hdc);
                    return 0;
            
            case WM_LBUTTONDOWN:
                    
                    return 0;
    
            case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
            }
    
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
    

    总结:

    1、所谓的无效区域就是Update Region (需要跟新的区域),有效区域就是不需要跟新的区域。 如果存在无效区域,系统就会产生WM_PAINT 消息。

    2、无效区域是可以被累加的,当队列中其他消息都被带走时,只剩下WM_PAINT 消息时,无效区域 统一重绘。

    3、并不是重绘了,无效区域就消失了,使无效区域消失的方法就是调用BeginPaint 。所以如果不在 WM_PAINT消息处理函数中调用BeginPaint ,那么无效区域总是存在,从而会不停的产生WM_PAINT 消息。所以就会不停进入WM_PAINT 消息处理函数~~

  • 相关阅读:
    通用接口测试用例设计(转载)
    Jenkin配置执行远程shell命令
    Jenkins创建Maven项目及SSH部署
    Jenkins插件安装和系统配置
    Jenkins+svn+ant+tomcat持续集成
    Jmeter之Bean shell使用(二)
    numba,让python速度提升百倍
    哪吒票房超复联4,100行python代码抓取豆瓣短评,看看网友怎么说
    小白如何入门 Python 爬虫?
    干货!小白入门Python数据科学全教程
  • 原文地址:https://www.cnblogs.com/douzi2/p/5648757.html
Copyright © 2020-2023  润新知