zoukankan      html  css  js  c++  java
  • 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 消息处理函数~~

  • 相关阅读:
    蒲公英
    大神-YY
    iOS开发精选知识点讲解 - 视频等 iOSStrongDemo是由@李刚维护,总结一些iOS开发精选知识点。每一个知识点都有相应的测试代码,非常适合iOS初学者。
    iOS开发UI篇—懒加载
    iOS开发UI篇—UITableviewcell的性能优化和缓存机制
    iOS开发UI篇—UITableview控件基本使用
    iOS开发UI篇—UITableview控件简单介绍
    iOS — Autolayout之Masonry解读
    iOS开发UI篇—多控制器和导航控制器简单介绍
    iOS开发网络篇—数据缓存
  • 原文地址:https://www.cnblogs.com/douzi2/p/5648757.html
Copyright © 2011-2022 走看看