您的位置:首页 > 其它

实现控件的透明背景

2013-04-07 17:46 274 查看
文章转自:http://blog.sina.com.cn/s/blog_4c3538470100ezhu.html

其二:如果程序不支持桌面主题服务,则不能使用上面的方法,比如程序运行在Windows2000上。这时我们可以向父窗口发送WM_PAINT消息,不过此消息所附带的wParam参数是一个画布句柄:
HDC dc = GetDC(NULL);
HWND cWnd= ...;//子窗口句柄
HWND pWnd= ...;//父窗口句柄
RECTcRect;
GetClientRect(cWnd,&cRect);
HBITMAPbitmap = CreateCompatibleBitmap(dc, cRect.right,cRect.bottom);
ReleaseDC(dc);
HDCmemDC = CreateCompatibleDC(NULL);
HGDIOBJoldBitmap = SelectObject(memDC, bitmap);
//此处可以调用SetClipRect()等函数来限制绘制范围
SendMessage(pWnd, WM_ERASEBKGND, (WPARAM)memDC,0);
SendMessage(pWnd, WM_PAINT, (WPARAM)memDC,0);
//至此memDC上已经保存了父窗口的背景内容
//用户可以调用BitBlt(...)等函数拷贝memDC的内容到子窗口的某个区域,这样就达到了透明效果;
SelectObject(memDC, oldBitmap);
DeleteDC(memDC);
DeleteObject(bitmap);
上面的办法当然有限制,因为不是所有的父窗口都可以接受这种特殊的WM_PAINT消息功能,不过MSDN中提到大多数控件都有这个功能,大家要注意读它的文档内容。

总结:方法是将父窗口的背景绘制在内存 DC 上,然后将这个背景图贴在控件指定位置,即可。
关键代码是这两行:

SendMessage(pWnd, WM_ERASEBKGND, (WPARAM)memDC,0);
SendMessage(pWnd, WM_PAINT, (WPARAM)memDC,0);

转载的文章,引用的代码有点纰漏
HBITMAPbitmap = CreateCompatibleBitmap(dc, cRect.right,cRect.bottom);

父窗口背景图的大小最好是父窗口的大小。
引用的代码:SendMessage(pWnd, WM_PAINT, (WPARAM)memDC,0);
父窗口的
WM_PAINT 消息处理,最好支持
WPARAM wParam 参数的处理,因为内存 dc
memDC
是作为参数传递的。
这种方法的父窗口绘图,应该还有可以优化的地方....
内存背景图 dc 可以定义成成员变量,由父窗口传入,子控件数量多了,这样可以减少运算量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: