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://img2024.cnblogs.com/blog/35695/202408/35695-20240825082459112-376424429.jpg)