心寄笔端 附庸风雅

甘草的技术博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

1. WS_CLIPCHILDREN

随便建立一个Win32 Application,大概在画线的位置,摆放一个Button。看两段代码的结果。

case WM_PAINT: //这段代码的CPU占用率很高,WM_PAINT会一直被处理
    hdc 
= GetDC(hWnd);
    MoveToEx(hdc, 
1010, NULL);
    LineTo(hdc, 
120120);
    ReleaseDC(hdc);
    
break;


case WM_PAINT:
    hdc 
= BeginPaint(hWnd, &ps);
    MoveToEx(hdc, 
1010, NULL);
    LineTo(hdc, 
120120);
    EndPaint(hWnd, 
&ps);

第一个代码的结果是线在Button上,第二个则不是。根源在于GetDC和WS_CLIPCHILDREN的关系,以及BeginPaint对消息队列的影响。


从《Windows图形编程》上面获得了BeginPaint的伪码:

HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT)
{
    DWORD dwFlags 
= 0;
    
if (GetWindowLong(hWnd, GWL_STYLE) & WS_CLIPCHILDREN)
        dwFlags 
|= DCX_CLIPCHILDREN;
    
if (GetWindowLong(hWnd, GWL_STYLE) & WS_CLIPSIBLINGS)
        dwFlags 
|= DCX_CLIPSIBLINGS;
    ...
    
return GetDCEx(hWnd, NULL, dwFlags | DCX_INTERSECTUPDATE | DCX_VALIDATE );
}

这个代码大致说明了CPU100%的问题。


看来,要Paint,还是很必要地把BeginPaint/EndPaint结合着用,看了一下MFC的代码,CWnd::OnPaint的DC对象,是一个CPaintDC,它的构造/析构函数,则是分别调用了BeginPaint/EndPaint。

2. ...

 

 

posted on 2010-09-24 22:44  甘草  阅读(254)  评论(0编辑  收藏  举报
Baidu
Google
心寄笔端
TEST
以后我会加上Power By的,先别介意