1. 程式人生 > >VC 點陣圖按鈕CBitmapButton的使用

VC 點陣圖按鈕CBitmapButton的使用

系統環境:Windows 7
軟體環境:Visual C++ 2008 SP1
本次目的:使用點陣圖按鈕,並且設定按鈕的滑鼠懸停效果

      在用MFC開發時,介面是比較不好開發的一塊。VC中自帶了CBitmapButton類,但是用途不多,網上很多Button類的派生類蠻實用的,但是若是簡單的點陣圖按鈕用自帶的CBitmapButton就可以實現了,以下是效果圖:

步驟一:新建基於對話方塊工程,放置一個按鈕,可以適當調整大小,設定其Owner Draw屬性為TRUE,右鍵為按鈕新增變數,改變其變數型別為CBitmapButton,按確定完成;

步驟二:匯入按鈕點陣圖,這裡四幅圖大小要一致,以下是四種狀體的按鈕,若讀者要實驗這次的設計的話,可以右鍵另存為,然後用“畫圖”把png格式的另存為bmp格式的。在資源檢視,右鍵“新增資源”,“匯入”以下圖片:

步驟三:初始化工作,在對話方塊的OnInitDialog()函式裡面新增以下程式碼:

  1. m_btButton.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4);   //載入
  2. m_btButton.SizeToContent();  //使按鈕適應圖片大小

步驟四:為控制點陣圖按鈕的可用、不可用新增程式碼,這是為了驗證第四種狀態的按鈕:

  1. void CTestDlg::OnBnClickedButton2()  
  2. {     
  3.     m_btButton.EnableWindow(0);  
  4. }  
  5. void
     CTestDlg::OnBnClickedButton3()  
  6. {     
  7.     m_btButton.EnableWindow();  
  8. }  

步驟五:到這裡已經完成了點陣圖按鈕的實現,編譯執行可以看到結果。但是滑鼠滑過的時候,按鈕並不會感應到焦點的存在。這裡用定時器捕獲焦點在按鈕上,並且改變此時的按鈕狀體為第三種圖片。首先為窗體新增OnTimer()事件,在OnTimer()函式裡面填寫如下程式碼:

  1. void CTestDlg::OnTimer(UINT_PTR nIDEvent)  
  2. {  
  3.     // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值
  4.     if
     (1==nIDEvent)  
  5.      {  
  6.       POINT p;  
  7.       GetCursorPos(&p);     
  8.       CWnd *hwnd;  
  9.       hwnd=WindowFromPoint(p);        //檢索視窗中包含指定的點;點必須指定螢幕座標在螢幕上的一個點。   
  10.       CWnd *hwnd2=GetDlgItem(IDC_BUTTON1);  
  11.       if (hwnd2 == hwnd)         //如果滑鼠在按鈕上
  12.       {  
  13.        if (GetFocus()!=hwnd2)        //如果按鈕無焦點,那麼設定焦點
  14.         hwnd2->SetFocus() ;  
  15.       }  
  16.       else//如果滑鼠不在按鈕上;
  17.       {  
  18.        if (GetFocus() == hwnd2 )                  //如果按鈕有焦點,那麼去焦點;
  19.         GetDlgItem(IDC_BUTTON2)->SetFocus();      //這裡的IDC_BUTTON2為你想跳轉到的控制元件ID號
  20.       }     
  21.      }  
  22.     CDialog::OnTimer(nIDEvent);  
  23. }  

最後在對話方塊的OnInitDialog()函式裡面新增開啟定時器,時間間隔200ms足夠了。

  1. SetTimer(1,200,NULL);  

完成後,執行就可實現與文章開頭所示的圖片一樣的效果。