图形界面任意形状图形按钮

图形界面任意形状图形按钮

ID:38696137

大小:436.00 KB

页数:6页

时间:2019-06-17

图形界面任意形状图形按钮_第1页
图形界面任意形状图形按钮_第2页
图形界面任意形状图形按钮_第3页
图形界面任意形状图形按钮_第4页
图形界面任意形状图形按钮_第5页
资源描述:

《图形界面任意形状图形按钮》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、图形界面上的任意形状图形按钮作者:effortsboysZYB下载源代码摘要随着计算机的发展和普及,人们对于软件的界面美观性要求越来越高。MFC提供了很多标准控件,比如按钮控件,按钮在MFC编程中有着较高的使用频率。本文将介绍如何实现在有背景图片的情况下,任意形状按钮的自绘方法。本文使用基于对话框工程程序进行演示。关键字:VC++ 按钮 自绘 任意形状图形一、实现原理我们知道windows窗口默认都是矩形,要实现任意形状的窗口就需要自绘。为此从CBUTTON派生一个按钮类CControlButton,重载DrawI

2、tem消息处理进行自绘。图片的背景是矩形的,假如我们的按钮图片是圆形的,当把图片绘制上去之后,我们发现多出了背景部分。如何消除背景呢?为了解决这个问题,我们可以用BitBlt中的MERGEPAINT和SRCAND的方式进行绘制。MERGEPAINT是把图形反色后再同贴图目的地进行OR操作,而SRCAND是把图形和贴图目的地进行AND操作。在计算机中,使用的是数字图像处理,每一种颜色都是由RGB表示的,RGB是指红、绿、蓝三原色,只要有这3种颜色和对应的颜色强度就可以合成各种颜色了。比如,黑色的RGB值为(0,0,0

3、),白色的RGB值为(255,255,255),括号内对应的是红绿蓝3种颜色的强度。在数字图像处理中可以实现OR、AND等逻辑运算。任何颜色同白色进行OR运算结果都为白色,进行AND运算结果都是该颜色本身;任何颜色跟黑色进行OR运算结果都为该颜色本身;进行AND运算结果都是黑色。为此,我们准备两张图片,如下图所示:图1       图2图1的背景为白色,图2是将图1中需要显示部分填充黑色而得。实现去除背景贴图关键代码如下:if(IsMask==TRUE)//值为真则去除图片背景{CDCMaskDC;MaskDC.C

4、reateCompatibleDC(pDC);if(IsBackBmp==TRUE)//使用和主窗口相同的背景图片{CBitmap*pOldBmp;CDCBackDC;BackDC.CreateCompatibleDC(pDC);pOldBmp=MaskDC.SelectObject(&m_MaskBitmap);BackDC.SelectObject(&m_BackBitmap);pDC->BitBlt(0,0,rect.Width(),rect.Height(),&BackDC,BackRect.left,Ba

5、ckRect.top,SRCCOPY);}pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MaskDC,0,0,MERGEPAINT);pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCAND);ReleaseDC(&MaskDC);}else{pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);}MaskDC是图2的DC,MemDC为图1

6、的DC。效果如下图所示:可能这时你就纳闷了,为什么背景色还是白色呢,是不是代码没有去掉图片的背景色呢?答案是贴图的时候已经去掉了背景色。请看分析按钮是一个子窗口,默认情况下主窗口和按钮子窗口背景都是白色,但是往往我们需要在主窗口上绘制一张图片,这样窗口看起来就比较美观。这样子做之后,按钮子窗口和主窗口的背景就不一样了。在进行按钮自绘的时候,那就是把按钮背景作为目的地进行OR、AND运算,因为按钮背景就是白色的,所以效果看起来也就是白色的。要解决这个问题也很简单,我们获取按钮所在主窗口中的矩形区域,把这个区域的主窗口

7、背景绘制到按钮中,再进行绘制按钮图片的操作就可以了。通过这样做之后,效果如下图:为此,我们已经得到一个图片按钮了。但仅仅这样还不行,这按钮的响应区域还是矩形区域,也就是说除了按钮图片之外的区域也响应鼠标点击。那我们就需要构造一个按钮图片区域,使用库函数SetWindowRgn就可以确定响应区域了。SetWindowRgn有个参数为HRGN类型,因此我们需要获得一个HRGN。Jean-EdouardLachand-Robert写了一个BitmapToRegion函数,函数的功能为把一张位图根据一种颜色转化为一个区域,

8、这个我们就可以得到一个HRGN。有关BitmapToRegion详情请看代码说明。我们用图2中的黑色区域去转化成区域,为此我们就得了一个图片按钮的响应区域了。另外,CControlButton类还提供了通常的四态按钮的支持,即鼠标划过、点击、正常、获得焦点四种情况对应加载四张不同的位图。二、成员函数介绍①voidCControlButton::SetMask

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。