半透明窗口中显示标准控件(控件与文字不透明)的实现方案(附源码)

来源:互联网 发布:sql server语句 编辑:程序博客网 时间:2024/06/05 20:29

原文 http://blog.csdn.net/harbinzju/article/details/7907127


和大家分享一下在半透明窗口中显示标准控件的实现方案。通过层叠窗口可以简单实现半透明与不规则形状窗口的效果,但在其上显示标准控件(控件与文字不透明)却是件比较有挑战的事情,这里会给出一个可行的解决方案。同时实现了一些可重用的窗口类,有相关需求时可以进行引用。先看一下效果图:



一、半透明窗口实现原理

绘制半透明窗口的通常做法是为窗口设置WS_EX_LAYERED属性,通过UpdateLayeredWindow或者SetLayeredWindowAttributes来设置窗口透明度等属性。这两种方法有一些区别、适合的场景也不同。

UpdateLayeredWindow:调用后窗口的绘制被接管,应用负责主动调用这个函数进行绘制,窗口及其控件不再能接收到WM_PAINT消息。可以把带有透明像素的PNG图片直接绘制在窗口上,实现不同程序的透明效果。

SetLayeredWindowAttributes:有两种模式:1. 指定特定像素透明。2. 设置整个窗口统一的透明度(包括控件)。使用这个函数再设置窗口透明,窗口及控件仍可以收到WM_PAINT消息。


需要特别注意的是UpdateLayeredWindowSetLayeredWindowAttributes的互斥性,在调用SetLayeredWindowAttributes后再调用UpdateLayeredWindow都会失败。

 

二、实现不规则窗口绘制

不规则的形状由PNG图片通过设置透明区域来实现,程序需要实现全透明区域的鼠标消息也透明。将需要进行透明处理的区域色彩设置为RGB(r,g,b),可以直接设置为RGB(0,0,0),通过SetLayeredWindowAttributes,将COLORREFcrKey参数设为RGB(r,g,b),即可以实现,这个透明效果不只是视觉上的透明,同时也会透过鼠标消息

 

三、在半透明背景中实现控件不透明

有时候我们只希望有透明像素的图片来做背景或者希望整个窗口有一定的透明度,但其上的控件不想做透明处理,否则控件上的文字会变得不明显,影响使用。这里提供的是双层窗口的解决方案。前景窗口作为背景窗口的子窗口,两个窗口时刻保持同样尺寸,同时移动,关闭事件关联处理。


前端窗口窗体全透明,并且透过鼠标消息,控件放置在前端窗口,不透明。实现方法是对WM_CTLCOLOR消息进行处理,窗口画刷返回m_crKey(比如RGB(0, 255, 0))颜色的画刷,其它控件默认处理。在窗口初始化的时候使用::SetLayeredWindowAttributes(m_hWnd, m_crKey, 0, LWA_COLORKEY); 设置对这个颜色透明。

[cpp] view plain copy
  1. <span style="font-size:18px;">HBRUSH CStandardDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)    
  2. {    
  3.     if (nCtlColor == CTLCOLOR_DLG)    
  4.     {    
  5.         return CreateSolidBrush(m_crKey);    
  6.     }    
  7.      
  8.     return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);    
  9. }</span>  

背景窗口使用预设的PNG图片,通过UpdateLayeredWindow绘制,并设置全透明的区域透过鼠标消息。调用UpdateLayeredWindow后窗口内容会被系统缓存,所以在窗口创建初次绘制后,如果没有特殊需要是不需要去重画背景窗口的。

 

这个方案支持所有标准的控件,同时也支持ActiveX控件,只要继承通用的基类,使用起来十分方便,有兴趣的朋友可以自己玩一下。附件的Demo主窗口展示了不规则形状窗口,镂空效果,控件悬浮效果,及ActiveX控件的使用;控件Demo中罗列了一系列标准控件。在Vista及以后的系统,由于有新API的支持可以实现更简单的半透明窗口(毛玻璃效果),就不用这么费周折了。

 

四、参考资料

http://www.codeproject.com/Articles/42032/Perfect-Semi-transparent-Shaped-Dialogs-with-Stand

http://www.codeproject.com/Articles/34158/Cool-Semi-transparent-and-Shaped-Dialogs-with-Stan

 

五、代码下载

http://download.csdn.net/detail/harbinzju/4525285


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 联通套餐不到期怎么办 联通全国流量包怎么办 缤智车钥匙丢了怎么办 车遮阳板松了怎么办 洗车把内饰划了怎么办 新车销售没销量怎么办 住院时间重叠了怎么办 长安cs75油耗高怎么办 墙内线烧了怎么办 如果没买票想进高铁站怎么办 老赖拒绝还款怎么办 gta5资产不兼容怎么办 平板黑屏闪退怎么办 施工证学历不够怎么办 隧道放炮声大怎么办 58工作被骗了怎么办 学历国家不承认怎么办 福州居住证一年到期怎么办 居住证过期2年怎么办 被房东坑了怎么办 房东违反了合同怎么办 上海居住证过期了怎么办 地铁卡消磁了怎么办 学生卡消磁了怎么办 家属院没房产证怎么办 邮箱收不到邮件怎么办 大学宿舍八人间怎么办 高中档案袋拆了怎么办 公派教师回国后怎么办? 事业单位辞职后档案怎么办 学信支付不了怎么办 校外怎么办北邮校园卡 报考身份证丢了怎么办 买房怎么办不取消低保 自考找不到真题怎么办 自考生考研没有档案怎么办 自考本科无学位怎么办 自考学位证书没拿到怎么办 自考毕业证出生日期错误怎么办 成考没有学位证怎么办 评职称学历认证怎么办