终于明白为什么在父窗口的wm_paint 中无法对子控件进行进行gdi操作了解决方法

终于明白为什么在父窗口的wm_paint 中无法对子控件进行进行gdi操作了
本帖最后由 VisualEleven 于 2012-12-06 13:32:27 编辑
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应该换成子控件的句柄
------解决方案--------------------
引用:
引用:
首先,你这个结论是错误的。
按照你这个形式来做的话,其实是可以的。
但是你的坐标转换错了。

ScreenToClient(hwnd,&pt1);  hwnd应该换成子控件的句柄

我的结论是对的,


这个函数就是这没用的,

终于明白为什么在父窗口的wm_paint 中无法对子控件进行进行gdi操作了解决方法
------解决方案--------------------
在对话框中画控件。
首先要 要 对话框 本身 画完。
然后 叫 控件 客户区 有效 (invalidate)
取控件的 DC 和 rect 画。。。