在想使用CButtonST的工程中加入BtnST.h、BtnST.cpp、BCMenu.h、BCMenu.cpp4个文件、2个类。

1. 在按钮上加入Icon,使Icon和文字同时显示

假设按钮ID为IDC_BUTTON1
a. 添加成员变量  CButtonST m_btn;

b. 添加Icon资源,设其ID设为IDI_ICON1
c. 在OnInitDialog函数中初始化按钮

m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_EOAPP);
m_btn.SetFlat(FALSE);

注意:为达到最好效果,请根据Icon的大小调整按钮的大小。

2. 显示平面按钮
只需要在效果一的基础上把m_btn.SetFlat(FALSE);语句去掉。
3. 使按钮上的图标可变

假设按钮ID为IDC_BUTTON1
1). 添加成员变量
CButtonST m_btn;
2). 添加两个Icon资源,ID设为IDI_ICON1和IDI_ICON2
IDI_ICON1是普通状态的图标,IDI_ICON2是按下时的图标
3). 在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON2,IDI_ICON1);

4. 设置按钮在不同状态下的底色和文字颜色

假设按钮ID为IDC_BUTTON1
1). 添加成员变量
      CButtonST m_btn;

2). 添加Icon资源,设其ID设为IDI_ICON1
3). 在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_BUTTON1,this);
      m_btn.SetIcon(IDI_ICON1);
      m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
      m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
      m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
提示:SetColor函数和OffsetColor函数的第一个参数表示按钮的各个状态,前景色就是文字的颜色,它们的取值表示:
      BTNST_COLOR_BK_IN //鼠标放在按钮内时的背景色
      BTNST_COLOR_FG_IN, //鼠标放在按钮内时的前景色
      BTNST_COLOR_BK_OUT, //普通状态时的背景色 
      BTNST_COLOR_FG_OUT, //普通状态时的前景色
      BTNST_COLOR_BK_FOCUS, //按钮被按下后的背景色
      BTNST_COLOR_FG_FOCUS, //按钮被按下后的前景色

5. 设置图标和文字的位置

假设按钮ID为IDC_BUTTON1
1).添加成员变量
      CButtonST m_btn;
2).添加Icon资源,ID设为IDI_ICON1
3).在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_BUTTON1,this);
      m_btn.SetIcon(IDI_ICON1);
      m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
提示:SetAlign函数的第一个参数表示位置信息,缺省情况下,文字在图标右边
      ST_ALIGN_HORIZ // 文字在右
      ST_ALIGN_VERT //文字在下
      ST_ALIGN_HORIZ_RIGHT// 文字在左
6. 根据Icon的形状设置按钮的形状

假设按钮ID为IDC_BUTTON1
1).添加成员变量
      CButtonST m_btn;
2).添加Icon资源,设其ID设为IDI_ICON1
3).在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_BUTTON1,this);
      m_btn.SetIcon(IDI_ICON1);
      m_btn.DrawBorder(FALSE);
      m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
      m_btn.SetColor(CButtonST::BTNST_COLOR_BK_IN, RGB(208,208,208));
      m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
注意:为达到最好效果,请根据Icon的大小调整按钮的大小。并根据实际情况设置背景颜色。请事先将按钮的文字去掉。
7. 添加Tooltips

假设按钮ID为IDC_BUTTON1
1).添加成员变量
      CButtonST m_btn;
2).添加Icon资源,设其ID设为IDI_ICON1
3). 在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_BUTTON1,this);
      m_btn.SetIcon(IDI_ICON1);
      m_btn.SetTooltipText(_T("This is a tooltip./r/nMultiline!"));

8. 改变鼠标进入按钮时的形状(超链接效果)

假设按钮ID为IDC_BUTTON1
1). 添加成员变量
      CButtonST m_btn;
2). 添加Icon资源,设其ID设为IDI_ICON1
3). 在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_BUTTON1,this);
      m_btn.SetIcon(IDI_ICON1);
      m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
      m_btn.SetURL("www.scut.edu.cn");
      m_btn.SetTooltipText("www.scut.edu.cn");
      m_btn.SetBtnCursor(IDC_CURSOR1);
9. 菜单按钮

假设按钮ID为IDC_BUTTON1
1).添加成员变量
      CButtonST m_btn;
2). 添加Icon资源,设其ID设为IDI_ICON1
3). 添加Menu,ID设为IDR_MENU
4). 在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_BUTTON1,this);
      m_btn.SetIcon(IDI_ICON1);
      m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
      m_btn.SetMenu(IDR_MENU, m_hWnd);
注意:菜单的效果类似与右键菜单,所有在设置菜单选项时只设置一列就够了。另外菜单的宽度与菜单的文字长度有关,可以用空格占位的办法以达到最佳效果。
10. 位图按钮

假设按钮ID为IDC_BUTTON1
1).添加成员变量
      CButtonST m_btn;
2).添加位图资源,ID设为IDB_BITMAP1
3).在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_BUTTON1,this); 
      m_btn.SetBitmaps(IDB_BITMAP1,RGB(0,0,0));
      m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
提示: 上面的SetBitmaps函数会将图片中颜色值为RGB(0,0,0)的点设为透明。
11. 按钮焦点

假设按钮ID为IDC_BUTTON1
1).添加成员变量
      CButtonST m_btn;
2). 添加Icon资源,设其ID设为IDI_ICON1
3). 在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_BUTTON1,this);
      m_btn.SetIcon(IDI_ICON1);
      m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
      m_btn.DrawFlatFocus(TRUE);
12. CheckBox按钮

假设按钮ID为IDC_BUTTON1
1).添加成员变量
      CButtonST m_btn;
2). 添加Icon资源,ID设为IDI_ICON1和IDI_ICON2
3).在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_CHECK1,this);
      m_btn.SetIcon(IDI_ICON1,IDI_ICON2);
      m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
提示:
      IDI_ICON1为选中时候显示的图标
      IDI_ICON2为为选中时候的图标
13. 透明按钮(按钮背景和窗口背景一样)

假设按钮ID为IDC_BUTTON1
1).添加成员变量
      CButtonST m_btn;
2). 添加Icon资源,ID设为IDI_ICON1
3).在OnInitDialog函数中初始化按钮
      m_btn.SubclassDlgItem(IDC_BUTTON1,this);
      m_btn.SetIcon(IDI_ICON1);
      m_btn.DrawTransparent(TRUE);
14. 特殊的PictureBox

利用CButtonST的特殊显示风格,完全可以把它当作一个PictureBox控件使用。这时一般会把按钮的属性设置为disable。
实例:演示程序的About页中使用了CButtonST来代替PictureBox。


两个CButtonST的派生类。

一、CWinXPButtonST类

CWinXPButtonST类 是一个CButtonST的派生类。它的特点是使用了WindowsXP中的圆角、黑色边框的风格。它包括WinXPButtonST.h和WinXPButtonST.cpp两个文件,而由于它是从CButtonST派生而来的,所以在引用它时,也要一并引入CButtonST的文件。
使用:
1. 引入文件,添加文件
2. 导入文件后,在SdtAfx.h文件中添加
      #include "WinXPButtonST.h"
3. 添加成员变量
      CWinXPButtonST m_btn2;
4. 假设按钮ID为IDC_BUTTON
      添加Icon资源,ID设为IDI_ICON1
5. 在OnInitDialog函数中初始化按钮
      m_btn2.SubclassDlgItem(IDC_BUTTON,this);
      m_btn2.SetIcon(IDI_ICON1);
      m_btn2.SetRounded(TRUE);
注意:但是它存在一个不足的地方,就是按钮的圆角是画出来的,按钮的形状仍然是原来的矩形。所以如果在有背景色的窗口中使用该按钮的话就会显得相当碍眼。在黑色的背景色中显示出难看的尖角,解决的办法是通过SetColor函数使得按钮的底色与窗口的底色一致。

二、CShadeButtonST类

CShadeButtonST类 是CButtonST的另一个派生类。它的特点是支持更为多样化的背景,通过SetShade函数可以为按钮设置9种不通的背景效果。它包括四个文件,它们分别是CeXDib.h、CeXDib.cpp、ShadeButtonST.h和ShadeButtonST.cpp。在引用它时,同样要一并引入CButtonST的文件。
使用:
1.引入文件,添加文件
2.导入文件后,在SdtAfx.h文件中添加
      #include "ShadeButtonST.h"
3.添加成员变量
      CShadeButtonST m_btn3;
4.假设按钮ID为IDC_BUTTON3
      添加Icon资源,ID设为IDI_ICON1

5.在OnInitDialog函数中初始化按钮
      m_btn3.SubclassDlgItem(IDC_BUTTON3,this);
      m_btn3.SetIcon(IDI_ICON1);
      m_btn3.SetShade(CShadeButtonST::SHS_METAL);

下面给出各种背景效果和对应的参数值:



CWnd::SubclassDlgItemBOOL SubclassDlgItem( UINT nID, CWnd* pParent );

Return Value

Nonzero if the function is successful; otherwise 0.

Parameters

nID---The control's ID.

pParent---The control's parent (usually a dialog box).

该函数用来子类化一个控件.

  Subclass(子类化)是MFC中最常用的 窗体技术 之一。子类化完成两个工作:1、是把窗体类对象(CButtonST)attach到一个windows窗体实体(自己创建的控件)中(即把一个窗体的hwnd赋给该类)。2、把 该类对象的消息 加入到 消息路由 中,使得该类可以捕获消息。

CButtonST m_btn;

m_btn.SubclassDlgItem(IDC_BUTTON,this);

SubclassDlgItem可以把 对话框中已有的控件 与 某个窗口对象 动态连接起来,该窗口对象 将接管 控件的消息处理,从而使控件具有新的特性.

SubclassDlgItem函数的声明为
BOOL SubclassDlgItem( UINT nID, CWnd* pParent );
参数nID是控件的ID,pParent是指向父窗口的指针.若连接成功则函数返回TRUE,否则返回FALSE.
综上所述,要在程序中使用派生控件,应该按下面两步进行:
1、在对话框模板中放置好基类控件.
2、在对话框类中嵌入派生控件类的对象.
在OnInitDialog中调用SubclassDlgItem将 派生类的控件对象 与 对话框中的基类控件 相连接,则这个 基类控件 变成了 派生控件

CButtonST的用法详解【转】的更多相关文章

  1. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  2. @RequestMapping 用法详解之地址映射

    @RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...

  3. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  4. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  5. CSS中伪类及伪元素用法详解

    CSS中伪类及伪元素用法详解   伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...

  6. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  7. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  8. systemctl命令用法详解

    systemctl命令用法详解系统环境:Fedora 16binpath:/bin/systemctlpackage:systemd-units systemctl enable httpd.serv ...

  9. CSS3的@keyframes用法详解:

    CSS3的@keyframes用法详解:此属性与animation属性是密切相关的,关于animation属性可以参阅CSS3的animation属性用法详解一章节. 一.基本知识:keyframes ...

随机推荐

  1. 关注SSO

    https://wiki.jasig.org/display/CASC/Configuring+the+Jasig+CAS+Client+for+Java+in+the+web.xml 其余的看osc ...

  2. 2015 8月之后"云计算"学习计划

    1. 自己在家搭建openstack,使用RDO搭建自己的openstack环境,不必源码方式搭建,只要搭建起来就好,越快越好 --以RDO方式,搭建一个all-in-one的主机,只需要租一台虚拟机 ...

  3. How to get the xpath by clicking an html element

    How to get the xpath by clicking an html element How to get the xpath by clicking an html element

  4. curl之post提交xml

    直接上代码: /** * 以post方式提交xml到对应的接口url * * @param string $xml 需要post的xml数据 * @param string $url url * @p ...

  5. Jquery 遍历数组之$().each方法与$.each()方法介绍

    $().each() 对于这个方法,在dom处理上用的比较多,如果一个html页面上面有多个checkbox,这时用$().each来处理checkbox是比较不错的; $("input[t ...

  6. hdu 2203亲和串 (kmp)

    #include<cstdio>#include<iostream>#include<cstring>#include<string>using nam ...

  7. visual studio 2013 使用IIS Express附加调试MVC5

    1.如何找到调试的站点的进程[由于图片无法上传,就不上传图片了] 2.vs运行的时候,在状态栏会存在一个IIS Express 进程,点击显示所有的应用程序,找到想要调试的程序的PID; 3.附加调试 ...

  8. Android应用开发提高篇(5)-----Camera使用

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/06/2382679.html 一.概述 Camera是手机的一个很重要的设备,可以说现在的每一部 ...

  9. hadoop 主节点存储告警

    之前只他调整过dfs 的存储目录到最大配额的目录,其它没有处理(就是在默认的/ 目录下,而这个目录的存储配额只有50G) 运行一周的时间不到,集群开始告警,查看是目录/ 的存储占用超过了60% 再查看 ...

  10. .htaccess Rewrite apache重写和配置

    首先: 必须要空间支持 Rewrite 以及对站点目录中有 .htaccess 的文件解析,才有效. 如何让空间支持Rewrite 和 .htaccess 的文件解析呢 往下看 第一步:要找到apac ...