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

透明控件的实现方法

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应用开发。
移动周报:生存还是毁灭 HTML5未来路在何方? 开发者的新机遇:微软生态系统打开开源大门 阻碍创新:谷歌、Facebook请求驳回抽象专利概念 Apple专利战分析:战火不停 创新不止 史上最牛独立开发者:花20美元狂赚100万美元 能给我解释一下下句吗? insmod bcm5700 不成功,高手看看我列出的错误. 这是真的假的? 跪求适用汽车客运站的物流系统(或者叫行包快件)的数据库设计?UP者有分。 请问VC7中的CImage在保存为JPEG时有没有设置品质这项. 多线程 怎么在CB中动态加载BPL库,并使用里面定义的窗体 好东东共用 vc+oracle+Ado时调用存储过程出现错误,不用savepoint时没问题,用了就出错怎么办。 java编写计算机 要分析数学表达式要分析包含+ 如何旺财运:财兴财旺财运到 在RT⊿ABC中,∠C=90°若AC=BC=4,则 Rt△ABC中,∠C=90°,AC=3,BC=4, 跪求斜抛运动射高公式及推导过程 谢 平面坐标系中,点到直线距离的计算?求, 请证明平面直角坐标系中点.面距离公式 平面直角坐标系的中点公式是什么?距离公式是什么? 已知点A3a在二次函数y=x²的图像上( 澳大利亚两个月间39人遭遇隆胸假体破美澳等多国驻外使馆被曝精心伪装 监听美国务卿首承认:某些时候美间谍活动走朴槿惠访欧正值韩英建交130周年 英经济滞缓导致欧元区通胀率降至2009全尺寸SUV来袭 一图读懂全新奔驰G周五大小盘指数变数大不带04的五数字.biz一夜之间被注财路通双十一重磅活动带你嗨翻天史上最受欢迎的阳台,只有你不懂?最终拘束异世之妖界萌主真真真不想穿越步步逍遥仙异界重生李探花右玉旅游黄杨山旅游江山旅游鄂伦春旅游莒县旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘