终于明白为什么在父窗口的wm_paint 中无法对子控件进行进行gdi操作了解决方法
终于明白为什么在父窗口的wm_paint 中无法对子控件进行进行gdi操作了
代码里有意用 子控件的dc
就是为了有意避开使用主窗口客户区域的dc.
结果黑色区域出现了,不过是在 主窗口以外。
结论:
wm_paint是无法对 子控件进行gdi操作的。
------解决方案--------------------
首先,你这个结论是错误的。
按照你这个形式来做的话,其实是可以的。
但是你的坐标转换错了。
ScreenToClient(hwnd,&pt1); hwnd应该换成子控件的句柄
------解决方案--------------------
![终于明白为什么在父窗口的wm_paint 中无法对子控件进行进行gdi操作了解决方法 终于明白为什么在父窗口的wm_paint 中无法对子控件进行进行gdi操作了解决方法](/default/index/img?u=aHR0cDovL3d3dy5teWV4Y2VwdGlvbnMubmV0L2ltZy8yMDEyLzEyLzIzLzE2MzIzNDQwOTIuZ2lm)
------解决方案--------------------
在对话框中画控件。
首先要 要 对话框 本身 画完。
然后 叫 控件 客户区 有效 (invalidate)
取控件的 DC 和 rect 画。。。
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd,&ps);
HDC hdc=GetDC(GetDlgItem(hwndList,IDC_LIST));
RECT rect;
GetWindowRect(hwndList,&rect);
POINT pt1,pt2;
pt1.x=rect.left;
pt1.y=rect.top;
pt2.x=rect.right;
pt2.y=rect.bottom;
ScreenToClient(hwnd,&pt1);
ScreenToClient(hwnd,&pt2);
rect.left=pt1.x;
rect.top=pt1.y;
rect.right=pt2.x;
rect.bottom=pt2.y;
FillRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
ReleaseDC(GetDlgItem(hwndList,IDC_LIST),hdc);
EndPaint(hwnd,&ps);
}
return 0 ;
break;
代码里有意用 子控件的dc
就是为了有意避开使用主窗口客户区域的dc.
结果黑色区域出现了,不过是在 主窗口以外。
结论:
wm_paint是无法对 子控件进行gdi操作的。
------解决方案--------------------
首先,你这个结论是错误的。
按照你这个形式来做的话,其实是可以的。
但是你的坐标转换错了。
ScreenToClient(hwnd,&pt1); hwnd应该换成子控件的句柄
------解决方案--------------------
------解决方案--------------------
在对话框中画控件。
首先要 要 对话框 本身 画完。
然后 叫 控件 客户区 有效 (invalidate)
取控件的 DC 和 rect 画。。。