社区
界面
帖子详情
如何让按钮透明,除了按钮中位图之外的区域透明显示窗体背景色?????????
DarkRiver
2004-04-30 05:27:31
按钮上贴了一副位图,位图随着鼠标的移动以及按钮的选种状态会动态变化,请问如何让按钮除位图之外的区域透明,我看了CButtonST没有看明白,谁能说出实现原理,最好给个例子或者是一段程序,分都送给你!
...全文
169
4
打赏
收藏
如何让按钮透明,除了按钮中位图之外的区域透明显示窗体背景色?????????
按钮上贴了一副位图,位图随着鼠标的移动以及按钮的选种状态会动态变化,请问如何让按钮除位图之外的区域透明,我看了CButtonST没有看明白,谁能说出实现原理,最好给个例子或者是一段程序,分都送给你!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
DarkRiver
2004-05-05
打赏
举报
回复
楼上的兄弟说的跟我猜测的差不多,他把没有画前景图之前的dc中保存成位图,然后在 以后在不同鼠标状态中运用,大家积极讨论吗!!!!!!!11
ringerxyz
2004-05-04
打赏
举报
回复
CButtonST好像是把背景位图保存起来,然后和你提供的位图一起画上去的吧,代码没看过
changcheng0534
2004-05-01
打赏
举报
回复
http://www.vckbase.com/article/advancedui/1.htm
兴许有用
wangjs720
2004-04-30
打赏
举报
回复
CButtonST的DrawTransparent()可以让按钮透明
原理很简单,你可以自已写一个自CButton派生的类,在DrawItem里,不国画边框,不要添充背景,真接把位图画上去上就了.
你可以网上找一个按钮里,然后去掉里面画边框和添充背景的代码就可以了
c++builder 用png 图片做的
窗体
背景半
透明
加入动画效果
c++builder 用png图片做的
窗体
背景半
透明
,加入动画效果,放了背景
透明
的两条鱼在那里游动,不需要用额外的技术,只是直接加入png图片。
vb 完美
透明
按钮
对以前的
透明
按钮
代码进行了全新整理,修正了多处错误。增加了初始化
按钮
背景
透明
度设置、提示文本,去掉了不必要的参数。
WINCE和Windows Mobile上的
透明
控件,图片
按钮
,图片标签,支持
窗体
背景图
WINCE和Windows Mobile上的
透明
控件,包括支持
透明
图片的
按钮
,
透明
文本标签以及
透明
图片标签,Panel
透明
容器等控件 可以设定正常
显示
图片,点击切换图片,前景、
背景色
。
按钮
上的文本可以设定是
显示
在
按钮
内部还是外部。可以自动拉伸图片以及调整图片
显示
位置。 使用方式可以查看附录的Demo
精彩编程与编程技巧-在VB
中
实现
位图
的
透明
放置...
精彩编程与编程技巧-在VB
中
实现
位图
的
透明
放置 ...
VC++做异形窗口
透明
效果
标准Windows应用程序窗口一般为带有标题栏的浅灰色矩形外观,因而“异形”对话框/窗口也主要是颜色与外形上动手脚。改变背景颜色 改变对话框(窗口)的背景颜色是最简单的改变Windows应用程序外观的方法,根据Windows创建与管理机理,一般有两种方法。一种是处理WM_CTLCOLOR消息,首先创建所选背景颜色的刷子,然后调用SetBkColor()或SetDialogBkColor()以所创建的刷子来绘制窗口或对话框的背景。需要重画窗口或对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,应用程序处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的刷子句柄。另外一种是响应Windows的WM_ERASEBKGND消息,Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用VC++的ClassWizard重载该消息的缺省处理程序来擦除背景(实际是用刷子画),并返回TRUE以防止Windows擦除窗口。2.改变窗口外形通过使用新的SDK函数SetWindowRgn(),可以将绘画和鼠标消息限定在窗口的一个指定的
区域
,因此实际上是使窗口成为指定的不规则形状(
区域
形状)。“
区域
”是Windows GDI
中
一种强有力的机制,
区域
是设备上的一块空间,可以是任意形状,复杂的
区域
可以由各个小
区域
组合而成。Windows内含的
区域
创建函数有CreateRectRgn()、CreatePolyRgn()、CreatePolygonRgn()、CreateRoundRectRgn()和CreateEllipticRgn(),再通过CombineRgn()来组合
区域
,即可得到复杂形状的
区域
,获得复杂形状的窗口外形。通过上面的方法虽然可以得到“异形”窗口,但感觉颜色单调,外形也不够“COOL”,能否获得更酷的“异形”对话框/窗口呢?回答是肯定的。下面就介绍利用
位图
和蒙板创建“异形”对话框/窗口的方法。3.利用
位图
创建异形对话框窗口利用
位图
创建异形对话框原理是根据象素的颜色来进行“扣像”处理,对所有非指定颜色象素
区域
进行
区域
组合。利用这一技术,实际上就是实现对话框/窗口的
位图
背景,并且对指定的颜色
区域
进行
透明
处理。下面就以
透明
位图
为背景的对话框为例来说明:首先用绘图软件如PhotoShop绘制编辑一幅拟做对话框背景用的图片,用BMP格式保存,假设存为Back.Bmp。需要说明的是,虽然Visual C++集成开发环境的资源编辑器只能编辑不超过16色的
位图
,但完全我们可以以真彩色方式存储,不必理会Visual C++的警告。下一步是用Visual C++的AppWizard创建一个基于对话框的应用程序假定命名为Trans。用资源编辑器引入背景图片Back.Bmp,如果是高彩色,不必理会出现的警告信息,点击OK确认即可。为了明确,修改默认的资源ID标识IDB_BITMAP1为IDB_BACKBMP。然后修改对话框的Style为Popup,Border为None,如图1 。图1向CTransDlg类添加
区域
处理功能模块void CTransDlg::SetupRegion(CDC *pDC /*对话框窗口DC*/, UINT BackBitmapID /*背景
位图
资源ID*/, UINT MaskBitmapID /*
区域
处理
位图
资源ID*/, COLORREF TransColor = 0x00000000 /*
透明
颜色值,默认为黑色*/)。到目前为止,我们暂时认为MaskBitmapID等同于BackBitmapID。其核心工作是根据MaskBitmapID指示
位图
的象素颜色进行
区域
组合。完整的代码如下:void CTransDlg::SetupRegion(CDC *pDC /*对话框窗口DC*/, UINT BackBitmapID /*背景
位图
资源ID*/,UINT MaskBitmapID /*
区域
处理
位图
资源ID*/,COLORREF TransColor /*
透明
颜色值*/){CDC memDC;CBitmap cBitmap;CBitmap* pOldMemBmp = NULL;COLORREF cl;CRect cRect;UINT x, y;CRgn wndRgn, rgnTemp;//取得窗口大小GetWindowRect(&cRect);//背景
位图
资源IDm_BackBitmapID = BackBitmapID//装载
位图
cBitmap.LoadBitmap(MaskBitmapID);memDC.CreateCompatibleDC(pDC);pOldMemBmp = memDC.SelectObject(&cBitmap);//首先创建默认的完整
区域
为完整的窗口
区域
wndRgn.CreateRectRgn(0, 0, cRect.Width(), cRect.Height());//下面的两层循环为检查背景
位图
象素颜色,进行
透明
区域
处理;//当象素颜色为指定的
透明
值时,即将该点从
区域
中
剪裁掉。//其
中
用到的几个成员变量m_MaskLeftOff、m_MaskTopOff、//m_MaskRightOff、m_MaskBottomOff、m_FrameWidth//和m_CaptionHeight,其作用后面再作说明,此时可全部当作0来处理。for(x= m_FrameWidth+m_MaskLeftOff;x<=cRect.Width() - m_FrameWidth-m_MaskRightOff; x++){for(y = m_CaptionHeight+m_MaskTopOff; yBitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRC/DownloadFiles\a\2001-10-12\COPY);if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );//删除系统却省的OnEraseBkgnd功能//return CDialog::OnEraseBkgnd(pDC);return TRUE;}接下来是在WM_PAINT的消息处理函数OnPaint()
中
添加代码。由于当背景
位图
比较大时,进行
区域
处理比较耗时,所以只在启动时进行一次处理。一种方法是OnInitDialog()处理,但这样会在从启动程序到窗口出现有相当的延迟,易引起程序尚未启动的误解。再一种方法就是在OnPaint()处理,但为了避免重复处理,可以加上一个判断标志。以下是OnPaint()的代码,正体为AppWizard生成,粗体为自己添加内容。void CTransDlg::OnPaint() {if (IsIconic()){……}else{if(m_nFirstRun){ //首次运行标志//修改鼠标光标为等待方式BeginWaitCursor();//设置背景
区域
SetupRegion(GetWindowDC(), 计算机教程用VC++实现异形窗口.来自www.itwen.comIT WEN计算机教程网 IDB_BACKBMP, IDB_BACKBMP, 0x00FFFFFF /*白色*/);//恢复鼠标光标为正常模式EndWaitCursor();m_nFirstRun = 0;}CDialog::OnPaint();}}剩下的工作就是根据背景
位图
的大小来设置对话框窗口的大小和位置,这可以在OnInitDialog()
中
通过调用MoveWindow()来实现。再添加一些变量的声名和初始化,即可编译运行。图2为运行结果示例:图24.进一步的讨论前面实现了单一模式的异形对话框,但有些情况下又需要不同的样式,如有标题栏、边框等,或者只作局部的处理,这就是前面两个成员变量m_FrameWidth和m_CaptionHeight作用,通过在OnInitDialog()判断窗口样式,使m_FrameWidth和m_CaptionHeight取不同的值。这部分的代码为:BOOL CTransBmpDlg::OnInitDialog(){……// TODO: Add extra initialization herem_nFirstRun = 1;//数据设置,窗口左上角坐标:m_Left=0,m_Top=0 //背景
位图
宽高:m_Width=535,m_Height=105SetSize(0, 0, 535, 105);//蒙板处理
区域
与窗口边框的距离m_MaskLeftOff=m_MaskTopOff=m_MaskRightOff=m_MaskBottomOff=0;//窗口边框与标题栏象素值m_FrameWidth = m_CaptionHeight = 0;//取得窗口样式LONG style = ::GetWindowLong(this->m_hWnd, GWL_STYLE);//如保留窗口风格样式,则根据不同的窗口边框类型 //选取不同的m_FrameWidth和m_CaptionHeight值, //也可以根据处理位置的需要进行付值if((style & WS_BORDER) == WS_BORDER)m_FrameWidth = ::GetSystemMetrics(SM_CXBORDER);if((style & WS_THICKFRAME) == WS_THICKFRAME)m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);if((style & DS_MODALFRAME) == DS_MODALFRAME)m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);if((style & WS_CAPTION) == WS_CAPTION){m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);m_CaptionHeight = ::GetSystemMetrics(SM_CYSMCAPTION);}m_CaptionHeight += m_FrameWidth * 2;//重置窗口的位置和大小MoveWindow(m_Left, m_Top, m_Width + m_FrameWidth * 2, m_Height + m_CaptionHeight, TRUE);……return TRUE; // return TRUE unless you set the focus to a control}另外,为进一步增加灵活性,使窗口样式不仅仅受背景
位图
颜色的控制。通过指定SetupRegion()的MaskBitmapID 为一个我们称之为“蒙板”的双色
位图
(多色彩也可以,但一般没有必要),即可实现需要的操作。图4为在同一背景
位图
上,通过图3的蒙板
位图
实现的效果,并且增加了对话框
窗体
的边框和标题栏属性。图3图4利用这种蒙板技术,可以创建出任意形状的窗口,而与背景
位图
无关。需要注意的是,对于对话框
中
的控件如
按钮
等,如处在或部分处在通明
区域
中
,则通明
区域
中
部分一并被剪裁掉,是否剪裁和剪裁位置与大小,利用蒙板可以很方便地进行控制。需要特别指出的是,SetWindowRgn()所指定的
区域
是针对整个窗口的,而Bitblt()/ StretchBlt()的输出
区域
是针对于客户区,两者在定位上是不同的,编程
中
应加以注意并灵活应用,这也是前面之所以设置边框大小等变量的原因。5.结束语这种异形窗口的创建不仅适应于对话框,而且适应于所有的基于CWnd类的派生窗口。采用这一方法,你可以创建出任何只要你能够画出的
窗体
,实现只要可以画出,就可以做出的目标。本文代码在Visual C++ 5.0、6.0下调试通过,运行正常,操作系统为Windows98SE。
界面
15,980
社区成员
115,867
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章