1. WS_CLIPCHILDREN
随便建立一个Win32 Application,大概在画线的位置,摆放一个Button。看两段代码的结果。
case WM_PAINT: //这段代码的CPU占用率很高,WM_PAINT会一直被处理
hdc = GetDC(hWnd);
MoveToEx(hdc, 10 , 10 , NULL);
LineTo(hdc, 120 , 120 );
ReleaseDC(hdc);
break ;
case WM_PAINT:
hdc = BeginPaint(hWnd, & ps);
MoveToEx(hdc, 10 , 10 , NULL);
LineTo(hdc, 120 , 120 );
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. ...
转载于:https://www.cnblogs.com/healerkx/articles/1834179.html