在想使用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. 4_Is Prime

    4 // // ViewController.swift // Is Prime // // Created by ZC on 16/1/9. // Copyright © 2016年 ZC. All ...

  2. 使用PyQt来编写第一个Python GUI程序

    原文:使用PyQt来编写第一个Python GUI程序 本文由 伯乐在线 - Lane 翻译,Daetalus 校稿.未经许可,禁止转载!英文出处:pythonforengineers.com.欢迎加 ...

  3. 动态链接库 DLL

    动态链接库DLL 不使用时不会有任何作用,只有在其他模块调用动态链接库中的函数时,它才发挥作用. 一.静态库与动态库 1.静态库 函数和数据被编译进一个二进制文件(.LIB),编译时,会将其组合起来创 ...

  4. 我的MYSQL学习心得 mysql的权限管理

    这一篇<我的MYSQL学习心得(十三)>将会讲解MYSQL的用户管理 在mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表有: 1.user表 2.db表 ...

  5. ios蓝牙开发(二)ios连接外设的代码实现

    上一篇文章介绍了蓝牙的技术知识,这里我们具体说明一下中心模式的应用场景.主设备(手机去扫描连接外设,发现外设服务和属性,操作服务和属性的应用.一般来说,外设(蓝牙设备,比如智能手环之类的东西), 会由 ...

  6. CSS换行1

    1.你定死表格的宽度,即给表格一个宽度值(是数值,不是百分比)   2.强制不换行 div{//white-space:不换行;normal 默认;nowrap强制在同一行内显示所有文本,直到文本结束 ...

  7. 防止 XSS 攻击 解决方案

    XSS又叫CSS英文缩写为Cross Site Script中文意思为跨站脚本攻击具体内容指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执 ...

  8. (转)Log4J日志配置详解

    http://www.cnblogs.com/ITtangtang/p/3926665.html 一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源 ...

  9. Spring 中拦截器与过滤器的区别

    spring 中拦截器 与servlet 的filter 有相似之处.比如二者都是aop 编程思想的体现都能实现权限检查,日志记录等. 不同之处 使用范围不同 Filter 是Servlet 规定的. ...

  10. [Swust OJ 402]--皇宫看守(树形dp)

    题目链接:http://acm.swust.edu.cn/problem/402/ Time limit(ms): 5000 Memory limit(kb): 65535   Description ...