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等,用到时再研究