WEB开发网
开发学院软件开发VC 图形界面上的任意形状图形按钮 阅读

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

 2008-12-24 19:39:50 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 一、实现原理我们知道windows窗口默认都是矩形,要实现任意形状的窗口就需要自绘,图形界面上的任意形状图形按钮,为此从CBUTTON派生一个按钮类CControlButton,重载DrawItem消息处理进行自绘,图片的背景是矩形的,图2是将图1中需要显示部分填充黑色而得,实现去除背

本文示例源代码或素材下载

一、实现原理

我们知道windows窗口默认都是矩形,要实现任意形状的窗口就需要自绘。为此从CBUTTON派生一个按钮类CControlButton,重载DrawItem消息处理进行自绘。图片的背景是矩形的,假如我们的按钮图片是圆形的,当把图片绘制上去之后,我们发现多出了背景部分。如何消除背景呢?

为了解决这个问题,我们可以用BitBlt 中的MERGEPAINT和SRCAND的方式进行绘制。 MERGEPAINT是把图形反色后再同贴图目的地进行OR操作,而SRCAND是把图形和贴图目的地进行AND操作。在计算机中,使用的是数字图像处理,每一种颜色都是由RGB表示的,RGB是指红、绿、蓝三原色,只要有这3种颜色和对应的颜色强度就可以合成各种颜色了。比如,黑色的RGB值为(0,0,0),白色的RGB值为(255,255,255),括号内对应的是红绿蓝3种颜色的强度。在数字图像处理中可以实现OR、AND等逻辑运算。任何颜色同白色进行OR运算结果都为白色,进行AND运算结果都是该颜色本身;任何颜色跟黑色进行OR运算结果都为该颜色本身;进行AND运算结果都是黑色。为此,我们准备两张图片,如下图所示:

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

图1    图2

图1的背景为白色,图2是将图1中需要显示部分填充黑色而得。实现去除背景贴图关键代码如下:

if (IsMask==TRUE) //值为真则去除图片背景
{
    CDC MaskDC;
    MaskDC.CreateCompatibleDC(pDC);
    if (IsBackBmp==TRUE)//使用和主窗口相同的背景图片
    {
       CBitmap *pOldBmp;
       CDC BackDC;
       BackDC.CreateCompatibleDC(pDC);
       pOldBmp = MaskDC.SelectObject(&m_MaskBitmap);
       BackDC.SelectObject(&m_BackBitmap);
       pDC->BitBlt(0,0,rect.Width(),rect.Height(),&BackDC,BackRect.left,BackRect.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的DC。

1 2 3  下一页

Tags:图形 界面 任意

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接