MFC內建的點陣圖按鈕CBitmapButton
使用VC++6中的CBitmapButton類,可以做出效果非常好的圖形按鈕來。
使用方法也非常簡單:
1.在對話方塊上拖放一個普通的按鈕控制元件;
2.宣告一個CBitmapButton類的例項;不要使用ClassWizard對映; //也就是在類嚮導不能新增變數
3.呼叫CBitmapButton類例項的LoadBitmaps方法,載入四幅點陣圖。這四幅點陣圖分別對應按鈕
的四種狀態:正常(U)狀態,按下(D)狀態,獲得輸入(F)狀態,禁止(X)狀態。
其中引數:
nIDBitmapResource是點陣圖按鈕正常狀態(U)下的點陣圖的資源ID。
nIDBitmapResourceSel是點陣圖按鈕按下狀態(D)下的點陣圖的資源ID。
nIDBitmapResourceFocus是點陣圖按鈕獲得輸入狀態(F)下的點陣圖的資源ID。
nIDBitmapResourceDisabled是點陣圖按鈕禁止狀態(X)下的點陣圖的資源ID。
4.使用CBitmapButton::SubclassDlgItem關聯到想要的按鈕。其中第一個引數是要關聯的按
鈕的ID,第二個引數是要關聯的按鈕所在的視窗的指標,一般來說,傳給它this就行了;
5.使用CBitmapButton::SizeToContent函式使按鈕適合圖片大小;
6.在對話方塊編輯器(或稱窗體編輯器吧 :-) )中,把關聯的按鈕控制元件的Owner draw屬性選
上。
好了,現在執行你的程式,是不是發現按鈕變成圖形按鈕了,而且效果還不錯呢。
不過唯一的遺憾是,現在軟體介面流行那種Hover按鈕,就是滑鼠移到按鈕上時,按鈕圖片
會顯示發亮、上移的效果,滑鼠移出按鈕則按鈕恢復原狀,而CBitmapButton類只有如上面所說的四種效果圖片,
不包含滑鼠移到按鈕上時的顯示圖片;我想到了一種辦法:利用 lpszBitmapResourceFocus(點陣圖
按鈕獲得焦點時的點陣圖),當滑鼠移動到按鈕上的時候,用程式碼使按鈕獲得焦點,當滑鼠移
出按鈕時,用程式碼使按鈕失去焦點,這樣就間接的實現了HoverButton,效果還不錯;
//實現Hover效果的處理程式碼:///////////////////////////////////////////////
//在初始化對話方塊的時候要用SetTimer函式設定一個定時器,200ms足矣;/////////
void CCBitmapButtonDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (1==nIDEvent)
{
POINT p;
GetCursorPos(&p);
CString s;
CWnd *hwnd;
s.Format("%d",hwnd=WindowFromPoint(p));
this->GetDC()->DrawText(s,CRect(10,10,100,100),0);
CWnd *hwnd2=GetDlgItem(IDC_BUTTON1);
if (hwnd2 == hwnd)//如果滑鼠在按鈕上
{
if (GetFocus()!=hwnd2)//如果按鈕無焦點,那麼設定焦點
hwnd2->SetFocus() ;
}
else//如果滑鼠不在按鈕上;
{
if (GetFocus() == hwnd2 )//如果按鈕有焦點,那麼去焦點;
GetDlgItem(IDC_EDIT1)->SetFocus();
}
}
CDialog::OnTimer(nIDEvent);
}
按鈕一般有四種狀態:up/normal, down/select, focus(意為首選,可能為畫面中只有一個按鈕,或上次選擇的就是此按鈕。對於windows來說,就是button上有一個虛線框的情況), disable。第一種是必須有的,後三種可選。因此,至少需要準備button的一張圖片。CBitmapButton的使用中,裝載按鈕圖片有兩種方法:AutoLoad()和LoadBitmaps()。
AutoLoad()法,該法將四種狀態下的圖片自動裝載到BitmapButton中。
1)在Dialog中拖入button控制元件,設定ownerdraw為true,caption為MYIMAGE(例),ID為IDC_MYIMAGE。
2)將四張圖片新增到bitmap資源,命名為"MYIMAGEU", "MYIMAGED", "MYIMAGEF", "MYIMAGEX",對應button四種狀態,名稱中需要加入分號。
3)在標頭檔案中手動新增物件CBitmapButton m_cBtn;
4)在對話方塊的OnInitDialog()中新增m_cBtn.AutoLoad(IDC_MYIMAGE, this);完成
LoadBitmaps()法。該法手動指定button每種狀態的圖片,優點是可以不提供不需要的狀態,如focus,且多個button可以使用同樣的圖片,在資源中只需裝載一次,節省空間。
1)在Dialog中拖入button控制元件,設定ownerdraw為true,ID任意(例:IDC_BUTTNO4)。
2)將所需圖片新增到bitmap資源中,ID任意(例:IDB_BTNU,IDB_BTND)。
3)在標頭檔案中手動新增物件CBitmapButton m_cBtn;
4)在OnInitDialog()中新增 m_cBtn.SubclassDlgItem(IDC_BUTTON4, this); //關聯按鈕和對話方塊
m_cBtn.LoadBitmaps(IDB_BTNU, IDB_BTND); m_cBtn.SizeToContent();//調整大小. 完成
下一步就是繼承CBitmapButton類,過載DrawItem實現文字寫入。
-------------------------------------------------------------------------------------------------
CBitmapButton
類CBitmapButton用於建立用點陣圖而不是文字做標籤的按鈕控制元件。CBitmapButton物件最多可包括4個點陣圖,分別代表按鈕所處的不同狀態:未按下(或正常)、按下(或選中)、獲得焦點和被禁止存取。只有第一個點陣圖是必須的,其它三個可以不提供。 點陣圖按鈕影象包括影象本身以及影象的邊框。邊框在表示按鈕的不同狀態時很有用。例如,按鈕獲得焦點時的點陣圖與未按下(或正常)狀態的點陣圖相同,但是在邊框中要麼嵌入了由間斷線組成的矩形,要麼嵌入了由粗實線組成的矩形。禁止存取狀態的按鈕的點陣圖通常和正常狀態的一樣,但是顏色的對比度較小,就象變灰的選單選項一樣。 這些點陣圖的尺寸可以不同,但都當成和正常狀態下點陣圖一樣的大小處理。 不同的應用對點陣圖有不同的組合應用。如下所示:未按下 | 按下 | 獲得焦點 | 禁止存取 | 應用 |
Ⅹ | 類Bitmap | |||
Ⅹ | Ⅹ | 沒有設定WS_TABSTOP的按鈕 | ||
Ⅹ | Ⅹ | Ⅹ | Ⅹ | 帶有所有狀態的對話方塊按鈕 |
Ⅹ | Ⅹ | Ⅹ | 設定WS_TABSTOP風格的對話方塊按鈕 |
1. | 為按鈕建立1到4個位圖。 |
2. | 構造CBitmapButton物件。 |
3. | 呼叫Create函式建立Windows按鈕控制元件,並把它加到CBitmapButton物件上。 |
4. | 呼叫成員函式LoadBitmaps載入點陣圖資源。 |
1. | 為按鈕建立1到4個位圖。 |
2. | 建立一個對話方塊模板,其中有一個自定義的按鈕放在需要點陣圖按鈕的位置。模板中按鈕的大小無關緊要。 |
3. | 把按鈕的標題設定為“MYIMAGE”一類的字串,併為按鈕定義一個類似於IDC_MYIMAGE的代號。 |
4. | 在應用的資源指令碼中,分別為每個給該按鈕建立的影象一個ID,ID的值為在步驟3中的標題後加上如下的一個字母——U、D、F或X,分別代表正常、按下、獲得焦點和禁止存取狀態下的按鈕。例如,標題設為“MYIMAGE”時,ID就應該是字串("MYIMAGEU"、"MYIMAGED"、"MYIMAGEF"和"MYIMAGEX")。點陣圖的ID必須用引號括起來,否則資源編輯器就會為資源賦上一個整數值,MFC在載入影象時就會失敗。 |
5. | 在應用的對話方塊類(從類CDialog繼承而來)中加上一個CBitmapButton成員物件。 |
6. | 在CDialog物件的OnInitDialog例程中呼叫CBitmapButton物件的AutoLoad函式,引數是按鈕的ID和CDialog物件的this指標。 |