1. 程式人生 > >MFC內建的點陣圖按鈕CBitmapButton

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風格的對話方塊按鈕
在建立一個點陣圖按鈕控制元件時,設定BS_OWNERDRAW則指明按鈕是自定義的(使用者自己繪製的)。這樣,Windows就會為該按鈕傳送WM_MEASUREITEM和WM_DRAWITEM訊息,由框架處理這些訊息並維護按鈕的外觀。 在視窗的客戶區建立一個點陣圖按鈕的步驟如下:
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指標。
如果想處理Windows的通知訊息,如點陣圖按鈕控制元件發給它的父物件(通常是從CDialog繼承來的)的BN_CLICKED訊息,就要在從CDialog繼承來的物件中加入訊息對映入口以及處理每個訊息的成員函式。CBitmapButton物件發出的通知和CButton物件發出的通知一樣。 類CToolBar對點陣圖物件的實現有些不同。