说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

透明控件的实现方法

HTML文档下载 WORD文档下载 PDF文档下载
在界面开发中,你需要实现一些炫的效果,你经常会遇到使控件透明方面的问题。在本文中我提供了一个实现透明控件的方法。源代码包含基于Win32 API的类CTransparentHelper,可以在MFC,ATL,WTL,Win32应用程序中或其它框架下使用。
介绍
在界面开发中,你需要实现一些炫的效果,你经常会遇到使控件透明方面的问题。在本文中
我提供了一个实现透明控件的方法。源代码包含基于Win32 API的类CTransparentHelper,
可以在MFC,ATL,WTL,Win32应用程序中或其它框架下使用。如果你有好的意见、BUG、问题
请发邮件给我,我会更新版本。你也可以访问我的技术博客 http://blog.uieasy.com/

下载源代码

介绍

在界面开发中,你需要实现一些炫的效果,你经常会遇到使控件透明方面的问题。在本文中

我提供了一个实现透明控件的方法。源代码包含基于Win32 API的类CTransparentHelper,

可以在MFC,ATL,WTL,Win32应用程序中或其它框架下使用。如果你有好的意见、BUG、问题

请发邮件给我,我会更新版本。你也可以访问我的技术博客 http://blog.uieasy.com/

 

背景

我写这个代码是因为我需要一些透明的控件,如:按钮、滑动控件、进度条等。

我发现当父窗口或控件移动时一些效果无效;当你在可改变大小的对话框中使用透明控件这将是一个问题。因此,我写了CTransparentHelper来解决。当MoveWindow调用后会有一个平滑的透明效果。

 

特点

1.没有依赖其它框架

2.能在不同类型的控件中使用

3.能在多层透明中使用

4.代码易用

 

使用代码

在介绍如何使用源代码前,我建议用内存DC存储父对话框的背景DC。这样使子控件的透明比如容易实现也提高了绘图效率。更多内容,请参考源代码。

 

包含 "TransparentHelper.h"

在需要透明显示的控件文件中 #include "TransparentHelper.h"

然后添加一个CTransparentHelper类型的对象.

#pragma once#include"TransparentHelper.h"// CSliderCtrlExclass CSliderCtrlEx : public CSliderCtrl{   .........   CTransparentHelper m_objTrans;}
初始化CTransparentHelper对象
void CSliderCtrlEx::PreSubclassWindow(){   // TODO: Add your specialized code here and/or call the base class   .......   CSliderCtrl::PreSubclassWindow();   m_objTrans.Install( GetSafeHwnd());   ......}
 在需要的时候调用 CTransparentHelper的TransparentBk函数
 
BOOL CSliderCtrlEx::OnSliderDrawChannel( CDC* pDC,   CRect& rect, UINT nState){   ......   if ( m_objTrans.IsValid() )   {      m_objTrans.TransparentBk( pDC->GetSafeHdc(), GetSafeHwnd());   }   .........   return TRUE;}
在控件的父窗口中添加代码
有时,父窗口是一个对话框,我需要处理WM_TRANSPARENT_BK消息,该消息从透明控件发送,目的是恢复DC。

LRESULT CTransparentControlDlg::OnTransaprentBk( WPARAM wParam,                                                 LPARAM lParam){   HDC hdc = ( HDC)wParam;   HWND hwnd = ( HWND)lParam;   CTransparentHelper::OnTranparentControl( m_pMemDC->GetSafeHdc(),                                           (WPARAM)hdc, (LPARAM)hwnd);   return TRUE;}
注:m_pMemDC是对话框的内存DC,当对话框尺寸变化时,m_pMemDC将会被改变。

背景更改时通知子控件
当对话框的内存DC更改,它必须所有透明的子控件。
void CTransparentControlDlg::BuildBkDC(){   //rebuild the background dc   ........   //when the parent dialog's background is rebuilt,   //notify the child which has an transparent tag.   CTransparentHelper::NotifyTransparentChild( GetSafeHwnd());}
WM_NOTIFY_TRANSPARENT消息
透明控件需要处理 WM_NOTIFY_TRANSPARENT消息,当背景改变,父窗口将发送该消息。
注:对于一些使用某些绘图函数的控件(例如:NM_CUSTOMDRAW),Invalidate不会导致真正的重绘。
因此,我添加 WM_NOTIFY_TRANSPARENT消息使其兼容。如果透明控件在调用Invalidate后能够自己
重绘则不需要处理该消息。
LRESULT CSliderCtrlEx::OnNotifyTransparent( WPARAM wParam,                                            LPARAM lParam){   if ( ::IsWindowEnabled( GetSafeHwnd()))   {      ::EnableWindow( GetSafeHwnd(),FALSE);      ::EnableWindow( GetSafeHwnd(),TRUE);   }   else   {      ::EnableWindow( GetSafeHwnd(),TRUE);      ::EnableWindow( GetSafeHwnd(),FALSE);   }   //This operation is for the repaint of slider control,   //because Invalidate can't bring the NM_CUSTOMDRAW message.   //M..., this may not the best method to solve the problem.   //If you have another method, please tell me.   return TRUE;}
关于作者
拥有8年软件架构开发经验,擅长用C++进行WINDOWS应用开发。
《近匠》云巴创始人张虎:低门槛云服务为小团队创造更多机会 Oculus公司同意收购Xbox 360手柄设计团队 公有云VS私有云 哪个数据更安全? 调查:开发者越老越吃香吗? Facebook在线支付:取代虚拟货币的终极边界 Google I/O前析:关于新一代设计框架Quantum Paper的猜想 Google I/O 2014前瞻:“令人发指”的Android产品线 福昕熊雨前:PDFium开源项目的背后 Dropbox无法登陆,国内企业网盘横向评测! 如果编程语言是超级英雄…… 谷歌发布Material Design设计语言 系统、功能与设计,Android L究竟新在哪儿? 《近匠》游道易副总裁孙可:发行商眼中的手游市场 布道师徐立:Docker是标准化IT结构的新方式 解读全新Google Play Games:多屏游戏时代终于来了! 设计神器PaintCode 2.1发布,完全支持Swift 一周消息树:天河二号以每秒3.3亿亿次的速度再居世界超算榜首 传闻微软计划用Lumia品牌取代Surface 【CTO俱乐部读书会】杨立东:技术团队留人“三板斧” 蓝港在线王世颖:浅谈手机游戏发行的成功基因 美国高通公司执行董事长Paul E. Jacobs:移动科技——精彩现在,辉煌未来 告别公用云,Instagram已将服务迁至Facebook数据中心 华为助力凤凰实现全媒体战略 跨平台2D/3D游戏开发框架libGDX发布1.2.0更新 Docker CEO Ben Golub:Docker借助开源、天时走向成功 社交网络先驱、服役十年的Orkut被谷歌关闭 支付宝风控系统对外输出 联合机构建支付安全生态圈 不同设备不同界面:Windows 9正在逼近! 福特联手英特尔 为汽车打造智慧感应系统 《近匠》环信:标准化即时通讯与未来社交构想 支持Swift!全新“四步测”BDD框架Quick诞生 关于Socket编程的几个问题 哪里有莫文蔚的《the way you make me feel》国语版的? 切~~~~~~~~菜~~~~~~~~~ 斑竹,我觉得这几天CSDN上很无聊,怎么老有人弱智地问重复的或者以前已有答案的问题?他们不知道可以search先? 谁知道哪里有bmp图片可以下载,给个详细网址,多谢 VC 兼职? 荷兰国旗问题 ASP刚学,用什么方式好吗 斑竹!!!!!!!!!!!!!!!! 关于IE浏览 请问vb如何访问foxpro 6.0的数据库,最好有源程序,谢谢. he_cti@163.net 算了,散分 我散,我散,我散散散 散3 发分!!!! 发分!!!!! 发分!!!!!!!! 发分!!!!!!!!!!!! 发分!!!!!!!!!!!!!!!!!!! 请问如何去掉测试版软件的“购买”提示框???急急急急!!! 有关获取HTML中Frames的问题? 给分!!!!!啊 给分!!!!!啊!! 给分!!!!!啊!!!!!! 给分!!!!!啊!!!!!!!!!!!!! 给啊!!!!!!!!!!!!! 不是俺蓄意谋两位帮主的反,实在是 ... APPLET连接数据库。。。(我已经每粉了) 千分散尽不复来!!! 千分散尽不复来!!!! 千分散尽不复来!!!!! 千分散尽不复来!! 千分散尽不复来!!!!!!!! 千分散尽不复来!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!! 用分把灌水乐园咽死!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!!!!!! 千分散尽不复来~ 千分散尽不复来~! 请教数据窗口的问题 千分散尽不复来? 千分散尽不复来?! 有LVS_OWNDATA属性的CListCtrl 加图标的问题,25分 在做会员注册时,在添加新数据页,程序一运行就在RS.updata出错,为什么(原程序) 高手请你回答我啦!!!! 我要回家了,第一个给300 哪有msproxy下载????? 请问要怎么样才能在自己写的程序运行时让用户无法使用开始菜单? 甲数的16%,等于乙数的32%,甲数是80,乙数是( ),如果乙数是80,甲数是( ) 数学有三个未知数的均值不等式的题怎么做.例:a、b、c属于R,证明:a方+b方+c方大于等于ab+bc+ca 我太笨 x分之0.125等于4分之1比百分之80要过程 已知甲数的五分之二等于乙数的二十五分之八,甲乙两数的比是多少?如果甲数是80则乙数是多少 cosA等于11\14,A等于多少, A加A加B加B得于70,A加B等于多少 甲数的3分之2等于乙数的5分之4,乙数是60,甲数是( ) 已知甲数的5分之2等于乙数的25分之8,甲数是80,则乙数是几?要全 a-a方等于多少 甲数的20%与4的和等于乙数的3分之2,甲数是80,求乙数? 甲数是24,乙数的3分之1等于甲数的8分之1,乙数是多少 √3+1分之2等于几(要求过程) 甲数比乙数多60%,乙数比甲数少百分之几? 甲数的4分之3等于乙数的5分之3,甲数是80,乙数是()是100还是150或者80 3—3分之3—2分之一等于多少? 32吨比60吨少百分之几?(百分号前保留一位小数);甲比乙多40,乙是80,甲比乙多百分之几?甲数是20,乙数是30,乙数比甲、乙两数的和少百分之几? 今天1元人民币等于多少日元? a 分之2等于b 分之3,那么a :b 等于( ):( 甲数是80的5分之4,乙数的百分之60是12,甲数比乙数多多少 现在4万日元等于多少人民币 10分之1除于10等于多少? 甲桶油是乙桶油的80%,乙桶是甲桶的百分之几?甲桶油比乙桶油少百分之几?乙桶比甲桶多百分之几? 今日日元汇率 1日元等于多少人民币? 1加1等于几有几种答案 甲数是乙数的倒数,乙数扩大10倍后是50,甲数是() 1600的80%怎么算 1.25等于什么分数 甲数是50,比乙数大10,甲数是乙数的( )%,乙数是甲数的( )%;甲数比乙数多()%;乙数比甲数少() 1600乘百分之四十等于? 1+1为什么等于2? 甲数是乙数的倒数,乙数扩大到原来的10倍后是50,甲数是 一人数的8倍加上68等于80的百分之九十这个数是几 5分之一减6分之一等于【用分数解答】 甲数的5分之1等于乙数的6分之1,乙数是10,求甲数 90加百分之60X等于102,解方程 4个5怎么算等于8 甲数的50%等於乙数的5分之4,如果甲数是10,乙数书多少?如果乙数是10,甲数是多少? 用+ 、-、×、÷、( )和分数把六个6组成四个算式,使运算的结果等于25. 4个五怎样算等于8 甲数是50,甲数的10分之1和乙数的2分之1相等,乙数是多少 2,4,6,8中间用+-×÷只能一次算要结果等于25怎么算? 4个8怎么算等于888 甲数的50%等于乙数的5分之4,如果甲数是10,乙数是多少?如果乙数是10,甲数是多少?要列式计算,不要方程 a,5,b,c,d,e,3要求相邻3个数和相等,a,d各等于多少 8000秒等于多少小时 5是10的50%,10是5的()% 甲数是40,乙数是50,甲数是乙数的(). π等于多少{1000位或以上} 649980秒等于多少小时?如何计算?我不知道这个时间应该怎么计算成小时?是按照传统的那种算法吗? 已知甲数的8分之1等于乙数的10分之1甲数是80则乙数是多少 角A加角B加角c加角d加角e 等于? 150000秒等于几个小时怎么计算的? 甲乙两个两位数,甲数的9分之8等于乙数的80%,甲数最大是(),乙数最小是() 在数学中e等于多少 8000小时相当于多少天? 甲数是乙数的80%,乙数是甲数的()%我要式子, 用C++编程用while循环,要求求e的值,e约等于1+1/1!+1/2!+1/3!+.+1/N! 要求直至最后一项的值小于10^- 337218秒等于多少小时多少分 ,怎么算的啊 甲数是乙数的125%,那么乙数是甲数的80%,请能仔细讲解为什么是甲数是5,乙数是4,怎么算的 单纯是不是就等于笨啊?单纯等于笨? 多少比16等于15比多少等于多少比80等于百分之125
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn