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

一、实现原理

我们知道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。

效果如下图所示:

时间: 2025-01-21 14:05:01

图形界面上的任意形状图形按钮的相关文章

求助:如何在Java图形界面上输出数组数据

问题描述 弄个文本框把已有的数组数据显示出来如果能弄成下来菜单的形式就再好不过了 解决方案 解决方案二:JFramef=newJFrame("gg");JPanelp=newJPanel();finalString[]g={"yaowei","yaowei1","yaowei2"};JComboBoxbox=newJComboBox(g);p.add(box);f.add(p);f.setDefaultCloseOperati

在Win8 Metro界面上添加关机及重启按钮教程

  操作步骤: 1.在Metro界面添加关机按钮 在任何地方新键一快捷方式,在请键入对象位置下输入以下内容: 关机快捷方式: C:WindowsSystem32shutdown.exe -s -hybrid 重启快捷方式: C:WindowsSystem32shutdown.exe -r 在建好的快捷方式上右击选择属性---更改图标,就可以自定义图标. 右击快捷方式选择固定到"开始"屏幕就可以发送到Metro界面了. 2.将关机按钮添加到任务栏 可以直接将上文中的关机或者重启快捷方式拖

java图形界面怎么画不出图形

问题描述 importjava.awt.*;importjavax.swing.*;publicclassTest1extendsJFrame{Wdmb6mb6=null;publicstaticvoidmain(String[]args){Test1lll=newTest1();}publicTest1(){mb6=newWdmb6();this.add(mb6);this.setLocation(300,280);this.setSize(400,300);this.setDefaultCl

《树莓派Python编程入门与实战(第2版)》——2.4 LXDE图形界面

2.4 LXDE图形界面 在LXDE图形界面中,可以看到以下两个部分. 桌面区: LXPanel区. 桌面区使你能够为常用的程序和文件创建快捷图标,从而更容易访问它们.只需要双击图标,就可以启动程序或打开文件.默认情况下,桌面上只会出现一个快捷图标,就是垃圾箱图标.可以在桌面的任何地方单击鼠标右键,以创建一个新的文件夹或文件图标. LXPanel是桌面顶部的包含了几个图标的一个工具栏区域.它使得你能够将一些较小的程序(叫作applet)放置到桌面界面上.有很多的applet可以用来直接在LXPa

java图形界面之布局设计_java

在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计.java.awt中定义了多种布局类,每种布局类对应一种布局的策略.常用的有以下布局类: •FlowLayout,依次放置组件. •BoarderLayout,将组件放置在边界上. •CardLayout,将组件像扑克牌一样叠放,而每次只能显示其中一个组件. •GridLayout,将显示区域按行.列划分成一个个相等的格子,组件依次放入这些格子中. •GridBagLayout,将显示区域划分成许多矩形小单元

C语言控制台窗口图形界面编程之七 键盘事件

输入事件中的键盘事件通常有字符事件和按键事件,这些事件的附带信息构成了键盘输入的信息,而想要读取这些信息,是要通过API函数ReadConsoleInput来获取的,函数原型如下: BOOL ReadConsoleInput( //读取输入信息 HANDLE hConsoleInput, //句柄 PINPUT_RECORD lpBuffer, //输入事件结构体的指针 DWORD nLength, //要读取的记录数 LPDWORD lpNumberOfEventsRead //用来接受成功读

C语言控制台窗口图形界面编程之五 控制文本移动的函数

控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动.下面我们介绍一个控制文本移动的函数,如下: BOOL ScrollConsoleScreenBuffer( //文本移动函数 HANDLE hConsoleOutput, //句柄 const SMALL_RECT *lpScrollRectangle, //移动区域 const SMALL_RECT *lpClipRectangle, //裁剪区域,如果为NULL,那么将代表整个屏幕缓冲区 COORD d

C语言控制台窗口图形界面编程之三 设置文本属性的函数

在这里介绍一个设置文本属性的函数,原型如下 BOOL SetConsoleTextAttribute( // 设置WriteConsole等函数的字符属性 HANDLE hConsoleOutput, // 句柄 WORD wAttributes // 文本属性 ); 本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/ 顺便提一下文本属性,其实就是颜色属性,有背景色和前景色(就是字符的颜色)两类,每一类只提供

C语言控制台窗口图形界面编程之一

本系列文章改编自<C语言控制台窗口界面编程(修正版)>.本系列文章会抛弃一些原文中难懂难理解且不常用的部分,并修改了部分样例程序.只为了更加清晰地学习C语言的控制台窗口界面编程.而想要更加深入的了解本系列文章,请阅读<C语言控制台窗口界面编程(修正版)>. <C语言控制台窗口界面编程(修正版)>下载地址:http://download.csdn.net/detail/jzqt_t/7471013 在Windows操作系统下用C语言编写控制台的窗口界面首先要获取当前标准输