1. 程式人生 > >MFC實現當滑鼠移動到button按鈕上時是顯示一張圖片,移開顯示另外一張,點選是顯示另外一張

MFC實現當滑鼠移動到button按鈕上時是顯示一張圖片,移開顯示另外一張,點選是顯示另外一張

程式設計中,經常要用到按鈕控制元件,大部分情況下,文字按鈕就OK了,但有時為了更好的效果,需要用到圖形按鈕。
在MFC中,應用CBitmapButton就可以實現圖形按鈕。CBitmapButton類繼承自CButton類。你可以為圖形按鈕指定四張圖片,分別對應按鈕的四種不同狀態:
正常顯示(Up),滑鼠按下(Down),獲得焦點(Focused),不可用(Disabled)。
正常顯示(Up)狀態的圖片是必須的,其他三張圖片是可選的。
還有,按鈕的Style必須指定為BS_OWNERDRAW.。
以下是利用CBitmapButton實現圖形按鈕的例項:
第一種方法:
(一)在VC6下新建一對話方塊工程,在對話方塊介面上拉出一按鈕控制元件
指定按鈕的Style為Owner Draw,即程式中得BS_OWNERDRAW樣式。
 
利用ClassWizard為按鈕關聯CButton類變數,然後將CButton型別手動改為CBitmapButton。
(二)匯入指定按鈕四種狀態的圖片
以下只匯入了3張圖片,分別對應Up,Down,Focused
 
(三)在對話方塊的OnInitDialog函式中新增如下程式碼
LoadBitmaps載入狀態圖片,注意順序為Up,Down,Focused,Disabled。
1 // TODO: Add extra initialization here  
2 m_btnBitmap.LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUSED);  //Disabled狀態的圖片沒有製作  
3 m_btnBitmap.SizeToContent();    //調整按鈕大小為圖片大小  
第二種方法:利用SubclassDlgItem
在介面中拉出一按鈕控制元件後,不用關聯變數,指定按鈕的Style為Owner Draw,然後同上一樣匯入四張狀態圖片。建立CBitmapButton物件(注意不要建立函式的區域性變數,否則在函式執行完畢時就銷燬了),最好建立為對話方塊的成員變數,在對話方塊的OnInitDialog初始化函式中用LoadBitmaps載入圖片,再利用SubclassDlgItem方法將該CBitmapButton與剛開始在介面上拉出的控制元件關聯。按鈕控制元件自動調整為和圖片一樣大小。
程式碼如下:
1 m_btnBitmap002.LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUSED);  
2 m_btnBitmap002.SubclassDlgItem(IDC_BTN_TESTAUTO, this);  
3 //CBitmapButton test;   //不可這樣定義區域性變數再關聯  
4 //test.LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUSED);  
5 //test.SubclassDlgItem(IDC_BTN_TESTAUTO, this);  
第三種方法:應用CBitmapButton的AutoLoad方法自動為按鈕載入圖片
BOOL AutoLoad(UINT nID, CWnd* pParent);
我們不用指定圖片的ID,那麼程式是採取怎樣的規則去載入圖片的呢?
規則:如果按鈕控制元件的Caption為Test,則四張點陣圖的ID應分別為“TestU”,“TestD”,“TestF”,“TestX”,分別對應Up,Down,Focused,Disabled狀態。注意:""也是ID的一部分。
所以步驟為:
(一)在對話方塊中拉出按鈕控制元件,Caption改為Test,指定按鈕的Style為Owner Draw。
(二)定義對話方塊的成員變數CBitmapButton   m_btnBitmap003;
(三)匯入四張狀態點陣圖,ID分別改為“TestU”,“TestD”,“TestF”,“TestX”。
(四)在對話方塊的OnInitDialog中呼叫AutoLoad方法
1 m_btnBitmap003.AutoLoad(IDC_BTNTEST, this);  
這種方法按鈕也會自動調整為和點陣圖一樣大小。