实现控件的透明背景
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 可以定义成成员变量,由父窗口传入,子控件数量多了,这样可以减少运算量。
其二:如果程序不支持桌面主题服务,则不能使用上面的方法,比如程序运行在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 可以定义成成员变量,由父窗口传入,子控件数量多了,这样可以减少运算量。
相关文章推荐
- QT 实现子控件的透明,可以实现主窗口设置背景皮肤
- 实现控件的透明背景
- 怎样实现QT3控件的背景为透明?
- MFC中实现Static控件背景透明
- 实现对话框在位图作为背景时的控件透明
- 实现对话框在位图作为背景时的控件透明
- 在Vb.net中实现透明控件背景
- MFC实现背景透明,控件不透明的对话框,且点击图片有事件响应
- 实现控件背景透明的几种方法
- MFC一一添加背景图片并让控件实现透明的
- 实现控件透明背景的几种方案
- rgba实现背景颜色透明
- CSS实现背景透明而背景上的文字不透明
- vb 6 listview的背景透明的实现
- Windows Mobile实现透明控件
- CSS实现背景透明,文字不透明(各浏览器兼容)
- .NET中如何将LABEL(标签控件)背景设为透明
- 转niutao:android 4.1.2 launcher2实现应用列表背景透明
- IOS实现自定义透明背景的tabbar
- RGBA实现背景颜色透明