文章本人轉(zhuǎn)自:http://www.vckbase.com/document/viewdoc/?id=517


CButtonST類主要包括BtnST.h、BtnST.cpp、BCMenu.h和BCMenu.cpp四個文件。如果你打算使用CButtonST的窗口不止一個,那么我建議你在VC++的Workspace | FileView中導(dǎo)入以上的四個文件之后,然后在SdtAfx.h文件中添加合適的include語句,如#include "BtnST.h"。



在接下來的幾篇文章中,我將根據(jù)作者提供的演示程序向大家介紹CButtonST的各種常用方法。在最后一篇文章中,將為各位提供CButtonST類的中文文檔,以供各位在以后的使用中參考。


效果一:在按鈕上加入Icon,使Icon和文字同時顯示



假設(shè)按鈕ID為IDC_BUTTON1

1. 添加成員變量


CButtonST	m_btn;

2. 添加Icon資源,設(shè)其ID設(shè)為IDI_ICON1

3. 在OnInitDialog函數(shù)中初始化按鈕


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

注意:為達到最好效果,請根據(jù)Icon的大小調(diào)整按鈕的大小。

實例:演示程序中的Standar 按鈕。



效果二:顯示平面按鈕

只需要在效果一的基礎(chǔ)上把m_btn.SetFlat(FALSE);語句去掉。



效果三:使按鈕上的圖標(biāo)可變

假設(shè)按鈕ID為IDC_BUTTON1

1. 添加成員變量


CButtonST	m_btn;

2. 添加兩個Icon資源,ID設(shè)為IDI_ICON1和IDI_ICON2

IDI_ICON1是普通狀態(tài)的圖標(biāo),IDI_ICON2是按下時的圖標(biāo)



3. 在OnInitDialog函數(shù)中初始化按鈕


m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON2,IDI_ICON1);

實例:演示程序中的Halloween 按鈕。



效果四:設(shè)置按鈕在不同狀態(tài)下的底色和文字顏色



假設(shè)按鈕ID為IDC_BUTTON1

1. 添加成員變量


CButtonST	m_btn;

2. 添加Icon資源,設(shè)其ID設(shè)為IDI_ICON1

3. 在OnInitDialog函數(shù)中初始化按鈕


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函數(shù)和OffsetColor函數(shù)的第一個參數(shù)表示按鈕的各個狀態(tài),前景色就是文字的顏色,它們的取值表示:


BTNST_COLOR_BK_IN	//鼠標(biāo)放在按鈕內(nèi)時的背景色
BTNST_COLOR_FG_IN,	//鼠標(biāo)放在按鈕內(nèi)時的前景色
BTNST_COLOR_BK_OUT,	//普通狀態(tài)時的背景色
BTNST_COLOR_FG_OUT,	//普通狀態(tài)時的前景色
BTNST_COLOR_BK_FOCUS,	//按鈕被按下后的背景色
BTNST_COLOR_FG_FOCUS,	//按鈕被按下后的前景色

實例:演示程序中的48×48 icon 按鈕、Zip按鈕等。



效果五:設(shè)置圖標(biāo)和文字的位置



假設(shè)按鈕ID為IDC_BUTTON1

1.添加成員變量


CButtonST	m_btn;

2.添加Icon資源,ID設(shè)為IDI_ICON1

3.在OnInitDialog函數(shù)中初始化按鈕


m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);

提示:SetAlign函數(shù)的第一個參數(shù)表示位置信息,缺省情況下,文字在圖標(biāo)右邊


ST_ALIGN_HORIZ	// 文字在右
ST_ALIGN_VERT	//文字在下
ST_ALIGN_HORIZ_RIGHT// 文字在左

實例:演示程序中的Search 按鈕。



效果六:根據(jù)Icon的形狀設(shè)置按鈕的形狀



假設(shè)按鈕ID為IDC_BUTTON1

1.添加成員變量


CButtonST	m_btn;

2.添加Icon資源,設(shè)其ID設(shè)為IDI_ICON1

3.在OnInitDialog函數(shù)中初始化按鈕


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));

注意:為達到最好效果,請根據(jù)Icon的大小調(diào)整按鈕的大小。

并根據(jù)實際情況設(shè)置背景顏色。請事先將按鈕的文字去掉。



效果七:添加Tooltips



假設(shè)按鈕ID為IDC_BUTTON1

1.添加成員變量


CButtonST	m_btn;

2.添加Icon資源,設(shè)其ID設(shè)為IDI_ICON1

3. 在OnInitDialog函數(shù)中初始化按鈕


m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetTooltipText(_T("This is a tooltip.\r\nMultiline!"));



效果一:改變鼠標(biāo)進入按鈕時的形狀(超鏈接效果)

假設(shè)按鈕ID為IDC_BUTTON1

1. 添加成員變量


CButtonST    m_btn;

2. 添加Icon資源,設(shè)其ID設(shè)為IDI_ICON1

3. 在OnInitDialog函數(shù)中初始化按鈕


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);



效果二:菜單按鈕




假設(shè)按鈕ID為IDC_BUTTON1

1.添加成員變量

 


CButtonST    m_btn;

2. 添加Icon資源,設(shè)其ID設(shè)為IDI_ICON1

3. 添加Menu,ID設(shè)為IDR_MENU

4. 在OnInitDialog函數(shù)中初始化按鈕


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);

注意:菜單的效果類似與右鍵菜單,所有在設(shè)置菜單選項時只設(shè)置一列就夠了。另外菜單的寬度與菜單的文字長度有關(guān),可以用空格占位的辦法以達到最佳效果。



在菜單中引入位圖的方法



1.添加ToolBar,依次使用Menu菜單項ID作為ToolBar按鈕的ID。

2.ToolBar上的按鈕圖標(biāo)將顯示在相應(yīng)的菜單項中。

將上面代碼中的m_btn.SetMenu(IDR_MENU, m_hWnd);

改為m_btn.SetMenu(IDR_MENU, m_hWnd, TRUE, IDR_TOOLBAR);

IDR_TOOLBAR為相應(yīng)ToolBar的ID。



效果三:位圖按鈕

假設(shè)按鈕ID為IDC_BUTTON1

1.添加成員變量

 


CButtonST    m_btn;

2.添加位圖資源,ID設(shè)為IDB_BITMAP1

3.在OnInitDialog函數(shù)中初始化按鈕


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函數(shù)會將圖片中顏色值為RGB(0,0,0)的點設(shè)為透明。



效果四:按鈕焦點



假設(shè)按鈕ID為IDC_BUTTON1

1.添加成員變量

 


CButtonST    m_btn;

2. 添加Icon資源,設(shè)其ID設(shè)為IDI_ICON1

3. 在OnInitDialog函數(shù)中初始化按鈕


m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
m_btn.DrawFlatFocus(TRUE);



效果五:CheckBox按鈕



假設(shè)按鈕ID為IDC_BUTTON1

1.添加成員變量

 


CButtonST    m_btn;

2. 添加Icon資源,ID設(shè)為IDI_ICON1和IDI_ICON2

3.在OnInitDialog函數(shù)中初始化按鈕


m_btn.SubclassDlgItem(IDC_CHECK1,this);
m_btn.SetIcon(IDI_ICON1,IDI_ICON2);
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);

提示:

IDI_ICON1為選中時候顯示的圖標(biāo)

IDI_ICON2為為選中時候的圖標(biāo)



效果六:透明按鈕



假設(shè)按鈕ID為IDC_BUTTON1

1.添加成員變量

 


CButtonST    m_btn;

2. 添加Icon資源,ID設(shè)為IDI_ICON1

3.在OnInitDialog函數(shù)中初始化按鈕


m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.DrawTransparent(TRUE);



效果七:特殊的PictureBox




利用CButtonST的特殊顯示風(fēng)格,完全可以把它當(dāng)作一個PictureBox控件使用。這時一般會把按鈕的屬性設(shè)置為disable。

實例:演示程序的About頁中使用了CButtonST來代替PictureBox。


一、CWinXPButtonST類



CWinXPButtonST類 是一個CButtonST的派生類。它的特點是使用了WindowsXP中的圓角、黑色邊框的風(fēng)格。它包括WinXPButtonST.h和WinXPButtonST.cpp兩個文件,而由于它是從CButtonST派生而來的,所以在引用它時,也要一并引入CButtonST的文件。

使用:

1. 引入文件,添加文件

2. 導(dǎo)入文件后,在SdtAfx.h文件中添加


#include "WinXPButtonST.h"

3. 添加成員變量


CWinXPButtonST	  m_btn2;

4. 假設(shè)按鈕ID為IDC_BUTTON

添加Icon資源,ID設(shè)為IDI_ICON1

5. 在OnInitDialog函數(shù)中初始化按鈕

 


m_btn2.SubclassDlgItem(IDC_BUTTON,this);
m_btn2.SetIcon(IDI_ICON1);
m_btn2.SetRounded(TRUE);

注意:但是它存在一個不足的地方,就是按鈕的圓角是畫出來的,按鈕的形狀仍然是原來的矩形。所以如果在有背景色的窗口中使用該按鈕的話就會顯得相當(dāng)?shù)K眼。

如圖所示,在黑色的背景色中顯示出難看的尖角:





解決的辦法是通過SetColor函數(shù)使得按鈕的底色與窗口的底色一致。



二、CShadeButtonST類



CShadeButtonST類 是CButtonST的另一個派生類。它的特點是支持更為多樣化的背景,通過SetShade函數(shù)可以為按鈕設(shè)置9種不通的背景效果。它包括四個文件,它們分別是CeXDib.h、CeXDib.cpp、ShadeButtonST.h和ShadeButtonST.cpp。在引用它時,同樣要一并引入CButtonST的文件。

使用:

1.引入文件,添加文件

2.導(dǎo)入文件后,在SdtAfx.h文件中添加

 


#include "ShadeButtonST.h"

3.添加成員變量


CShadeButtonST	m_btn3;

4.假設(shè)按鈕ID為IDC_BUTTON3

添加Icon資源,ID設(shè)為IDI_ICON1



5.在OnInitDialog函數(shù)中初始化按鈕


m_btn3.SubclassDlgItem(IDC_BUTTON3,this);
m_btn3.SetIcon(IDI_ICON1);
m_btn3.SetShade(CShadeButtonST::SHS_METAL);

下面給出各種背景效果和對應(yīng)的參數(shù)值。