CButtonST的使用_demystify的博客-程序员宝宝

技术标签: Win  

CButtonST是功能强大的按钮类,通过它可以实现多样化、美观的按钮控件。

一、CButtonST类

1、使用方法:通过MFC类向导(常用)或动态创建(Create)

         在MFC对话框模板中添加“按钮资源”,在模板对应的对话框类中添加CButtonST成员,在类的DataExchange方法中添加DDX_Control相关,最后在OnInitDialog中添加风格设置代码;

另外一种最近发现的方法:添加“按钮资源”,添加CButtonST  m_btn成员之后,在OnInitDialog中首先调用m_btn.SubclassDlgItem( IDC_BUTTON1, this),然后设定风格;

        其实,通过MFC的DDX_Control设置和通过SubclassDlgItem是一回事,都是使用MFC中的SUBCLASSING技术,使新风格控件(CButtonST)的窗口过程替换掉基类(CButton)的窗口过程,从而可以使用新风格控件的属性和方法。

2、颜色设置

        可以设置六种颜色:通过枚举标识:

BTNST_COLOR_BK_IN:鼠标在内部时的背景颜色

BTNST_COLOR_FG_IN:  鼠标在内部时的文本颜色

BTNST_COLOR_BK_OUT:鼠标在外部时的背景颜色

BTNST_COLOR_FG_OUT:鼠标在外部时的文本颜色

BTNST_COLOR_BK_FOCUS:当按钮获得焦点时的背景颜色

BTNST_COLOR_FG_FOCUS:当按钮获得焦点是的文本颜色

可以通过以下函数设置颜色:

        (1)、DWORD SetDefaultColors(BOOL bRepaint = TRUE)  ;// 设置默认颜色

          参数: bRepaint:重绘标记

          返回值:BTNST_OK

          作用:将字体颜色都设置为COLOR_BTNTEXT,通过::GetSysColor(COLOR_BTNTEXT)指定。将背景色都设置为COLOR_BTNFACE,通过::GetSysColor(COLOR_BTNFACE)指定。

注:介绍一下CButtonST中用到的返回值含义:

BTNST_OK                                           0

BTNST_INVALIDRESOURCE              1

BTNST_FAILEDMASK                          2

BTNST_INVALIDINDEX                        3

BTNST_INVALIDALIGN                        4

BTNST_BADPARAM 5

BTNST_INVALIDPRESSEDSTYLE      6

(2)、DWORD GetColor(BYTE byColorIndex, COLORREF* crpColor);  //获取指定的颜色

参数:byColorIndex ,六种颜色枚举之一,指定要获取的颜色

           crpColor,作为输出参数,返回获取的颜色;

返回值:BTNST_OK

(3)、DWORD SetColor(BYTE byColorIndex, COLORREF crColor, BOOL bRepaint = TRUE); //设置指定的颜色

参数: byColorIndex,颜色索引

            crColor,输入参数,指定的颜色值

            bRepaint:重绘标记

(4)、DWORD OffsetColor(BYTE byColorIndex, short shOffset, BOOL bRepaint) ;//通过偏移来调节颜色,该函数很方便使颜色变浅或变深

参数:byColorIndex:颜色索引

           shOffset:颜色偏移值,该值会让RGB分量都增加相同的偏移量,如偏移值大于零,能够调节到的最亮状态是最高颜色分量为255;若偏移值小于零,能够调节的最暗状态是使最低颜色分量等于0.

           bRepaint:重绘标记

 

3、状态设置(仅对单选按钮有效,如果不是单选按钮,以下函数无意义)

(1)、int GetCheck() ;//获得CheckBox的状态

 (2)、DWORD SetCheck(int nCheck, BOOL bRepaint = TRUE);//设置CheckBox的状态

4、设置图标

(1)、DWORD SetIcon(int nIconIn, int nCxDesiredIn, int nCyDesiredIn, int nIconOut = NULL, int nCxDesiredOut = 0, int nCyDesiredOut = 0);
DWORD SetIcon(int nIconIn, int nIconOut = NULL);
DWORD SetIcon(HICON hIconIn, HICON hIconOut = NULL);

参数:nIconIn,hIconIn,标识当鼠标在按钮上时,显示的图标;

           nIconout, hIconOut标识当鼠标在按钮外面时,显示的图标;

注意:当nIconout指定为BTNST_AUTO_GRAY时,当鼠标在按钮外面时,显示的图标是鼠标在按钮上时的图标的“变灰”效果。指定为BTNST_AUTO_DARKER时,是“降低15%”灰度效果。

          nCxDesiredIn,nCyDesiredIn指定第一幅图标的像素宽度和高度;

          nCxDesiredOut, nCyDesiredOut指定第二副图标的像素宽度和高度;

例子:

        m_btn.SetIcon( IDI_ICON4);

        m_btn.SetIcon( IDI_ICON4, BTNST_ANTO_GRAY);

        m_btn.SetIcon( IDI_ICON4, BTNST_ANTO_DARKER);

        m_btn.SetIcon( IDI_ICON4, IDI_ICON5);

        m_btn.SetIcon( IDI_ICON4, 32, 32, IDI_ICON4, 16, 16);

5、设置文字与ICON(或Bitmap)的对齐方式

         DWORD SetAlign(BYTE byAlign, BOOL bRepaint = TRUE);

         参数:byAlign,指定对齐风格,可以是以下枚举:(默认是ST_ALIGN_HORIZ)

                     ST_ALIGN_HORIZ          Icon/bitmap 在left,  text在right

                     ST_ALIGN_VERT            Icon/bitmap在top,   text在bottom

                     ST_ALIGN_HORIZ_RIGHT   Icon/bitmap在right, text在left

                     ST_ALIGN_OVERLAP        Icon/bitmap与text在相同位置

                 bRepaint,重绘标记

6、设置气泡提示

void SetTooltipText(int nText, BOOL bActivate = TRUE);
void SetTooltipText(LPCTSTR lpszText, BOOL bActivate = TRUE);

参数:nText:气泡提示文本,字符串资源ID;

           lpszText:气泡提示文本

           bActive:当为TRUE时,气泡提示创建时即激活,FALSE时,创建时不激活。

void ActivateTooltip(BOOL bEnable = TRUE);//enable或disable Tooltip功能

DWORD EnableBalloonTooltip();//开启气泡风格提示框,该函数必须在任何SetTooltipText函数调用之前调用。

例子:

m_btn5.SetTooltipText("http://cn.bing.com/", TRUE );

7、设置URL

DWORD SetURL(LPCTSTR lpszURL = NULL); //设置超链接

例如:m_btn5.SetURL("http://cn.bing.com/");点击按钮就会在浏览器中打开该网址。

 

8、设置位图

DWORD SetBitmaps(int nBitmapIn, COLORREF crTransColorIn, int nBitmapOut = NULL, COLORREF crTransColorOut = 0);

DWORD SetBitmaps(HBITMAP hBitmapIn, COLORREF crTransColorIn, HBITMAP hBitmapOut = NULL, COLORREF crTransColorOut = 0);

参数:nBitmapIn, hBitmapIn,指定当鼠标移动到按钮上时,显示的位图

          nBitmapOut, hBitmapOut,指定当鼠标在按钮外面时,显示的位图

          crTransColorIn,指定用于代替BitmapIn的透明色

          crTransColorOut,指定用于代替Bitmapout的透明色。

9、设置菜单

#ifdef BTNST_USE_BCMENU
DWORD SetMenu(UINT nMenu, HWND hParentWnd, BOOL bWinXPStyle = TRUE, UINT nToolbarID =        NULL, CSize sizeToolbarIcon = CSize(16, 16), COLORREF crToolbarBk = RGB(255, 0, 255), BOOL bRepaint = TRUE);
#else
DWORD SetMenu(UINT nMenu, HWND hParentWnd, BOOL bRepaint = TRUE);
#endif
DWORD SetMenuCallback(HWND hWnd, UINT nMessage, LPARAM lParam = 0);

10、设置为平面按钮( 平面式简约风格按钮)

DWORD SetFlat(BOOL bFlat = TRUE, BOOL bRepaint = TRUE);

参数:bFlat,为TRUE,表示按钮将拥有flatStyle,FAlSE;表示拥有standard风格

           bRepaint:重绘标记

 

11、根据Icon的形状设置按钮的形状

void SizeToContent();//设置按钮的大小与Image一致,为达到最佳效果,IN image与Out Image应该保持一样大小。

12、设置透明

void DrawTransparent(BOOL bRepaint = FALSE); // 设置透明模式,操作不可逆,另外代码注释解释说,若非真的需要,不要使用透明模式,因为透明模式会产生按钮背景的一份Copy,带来不必要的内存和额外开销。

       参数:bRepaint:重绘标记

 

13、设置光标

DWORD SetBtnCursor(int nCursorId = NULL, BOOL bRepaint = TRUE);//设置当鼠标在按钮之上时显示的光标

       参数:nCursordId,光标资源ID,   bRepaint,重绘标记

14、设置声音

#ifdef BTNST_USE_SOUND
DWORD SetSound(LPCTSTR lpszSound, HMODULE hMod = NULL, BOOL bPlayOnClick = FALSE, BOOL bPlayAsync = TRUE);
#endif

15.其他接口

BOOL GetDefault(); //若按钮不是默认按钮返回FALSE,若按钮是默认按钮返回TRUE;

DWORD SetBk(CDC* pDC); //绘制背景

 

DWORD SetAlwaysTrack(BOOL bAlwaysTrack = TRUE);//设置按钮是否总是高亮(hilight)

       参数:bAlwaysTrack为TRUE,即使父窗口不是活动窗口,按钮也会保持高亮,FALSE,只有父窗口是活动窗时,按钮才会保持高亮。

注意:此函数只能应用于flat button.

 

DWORD SetPressedStyle(BYTE byStyle, BOOL bRepaint = TRUE);//设置加压方式

参数:byStyle:可以是以下枚举:

BTNST_PRESSED_LEFTRIGHT:(默认方式)

BTNST_PRESSED_TOPBOTTOM

void SetPressedState(BOOL isPress){m_bIsPressed =isPress; }//设置按压状态

 

DWORD DrawBorder(BOOL bDrawBorder = TRUE, BOOL bRepaint = TRUE)//控制是否绘制按钮边界

注意:注释解释此函数仅用于flat button.测试发现一般按钮也可以应用。

 

DWORD DrawFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint = TRUE);//控制是否绘制焦点矩形

二、其他从CButtonST派生的按钮类

CWinXPButtonST、CShadeButtonST等,用到时再研究

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/44860311

智能推荐

windbg命令_ken_scott的博客-程序员宝宝

windbg命令linux下使用ulimit -S -c unlimited命令,可以使程序崩溃时生成core文件,使用gdb exec_file core_file就可以查看崩溃的程序,接着使用bt就基本可以定位触发崩溃的代码段windows下没有这么方便,但可以使用procexp和windbg来达到相同的目的,程序崩溃后,可以打开procexp,然后在procexp中选择崩溃的程序,右

关于原码&反码&补码&移位运算详解_weixin_34161029的博客-程序员宝宝

2019独角兽企业重金招聘Python工程师标准>>> ...

深度学习 解决过拟合问题_蜗牛在听雨的博客-程序员宝宝_深度学习过拟合

一、问题在深度学习时,一般将数据集划分成训练集和测试集。如果最终的训练结果不满意,一般就是以下两种情况:(1)训练集的准确率不高,测试集的准确率也不高;(欠拟合)(2)训练集的准确率非常高,测试集的准确率比训练集差上许多。(过拟合)对于第(1)种情况,一般是因为模型自身的问题,比如模型本身选择的不对,模型的类型不对或者模型的深度太浅了,需要重新选择合适的模型。对于第(2)种情况,通过训练过程中的损失值变化可以判断出过拟合情况的发生。例如下面的两个图,训练集上的损失一直在下降,但验证集的损失函数在某

Gitlab 架构---nginx_kapuliyuehan的博客-程序员宝宝

nginx的简单应用参考 http://nginx.org/en/docs/beginners_guide.html对于简单的应用足够了

git 常见问题__小乔_的博客-程序员宝宝

1.unable to negotiate with *.*.*.*: no matching key exchange methodfound...可以在C:\Users\Spring\.ssh的config文件下,添加内容如下,[本人测试有作用]Host *.*.*.* KexAlgorithms +diffie-hellman-group1-sha1...

随便推点

luasocket系列之winsocket基础补充_TcpServerDemo_sunning9001的博客-程序员宝宝

initsock.h  代码://winsocket2头文件,用于使用winsock2网络库#include #pragma comment(lib, "WS2_32") // 链接到WS2_32.libclass CInitSock {public: CInitSock(BYTE minorVer = 2, BYTE majorVer = 2) { // 初始化WS2_

虚拟机Linux的联网问题_ZY_017的博客-程序员宝宝

一:NAT模式1.在PC打开网络和共享中心→以太网/无线网络连接→属性→共享→勾选“允许VMnet8”2.虚拟机上按编辑→虚拟网络编辑器,编辑 VMnet8下的子网IP,参考cmd下ipconfig/all的VMnet8的IPv4地址   子网号与VMnet8相同,如子网IP就填192.168.137.03.ifup eth0  #打开网卡   vim /etc/sysconf

minifilter---context_jjjyu123的博客-程序员宝宝

Why does one need contexts ? Well, the IO model in NT is based on passing objects around and the various components that handle these objects need a way to save information about each object (for exam

汇编基础--cmp汇编指令_wfq0987的博客-程序员宝宝_cmp 汇编

<br /> cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位。其他的指令通过识别这些被影响的标志位来得知比较结果。<br /><br />     cmp指令格式:   cmp   操作对象1, 操作对象2<br /><br />     计算 操作对象1 - 操作对象2 但不保存结果,只是根据结果修改相应的标志位。<br /><br />     举例假如此时eax = 0h<br />     那么cmp eax, eax     (eax - eax = 0)<br

as2.0 清除主时间轴上所有的影片简介_weixin_30840253的博客-程序员宝宝

for (var i in _root) { if (typeof _root[i] == "movieclip") { _root[i].swapDepths(1); _root[i].removeMovieClip(); } }转载于:htt...

JavaScript中的继承之借用构造函数_weixin_34235135的博客-程序员宝宝

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...