系統環境:Windows 10
軟件環境:Visual C++ 2013 SP1
本次目的:使用位圖按鈕,並且設置按鈕的鼠標懸停效果
在用MFC開發時,界面是比較不好開發的一塊。VC中自帶了CBitmapButton類,但是用途不多,網上很多Button類的派生類蠻實用的,但是若是簡單的位圖按鈕用自帶的CBitmapButton就可以實現了,以下是效果圖:
步驟一:新建基於對話框工程,放置一個按鈕,可以適當調整大小,設置其Owner Draw屬性為TRUE,右鍵為按鈕添加變量,改變其變量類型為CBitmapButton,按確定完成;
步驟二:導入按鈕位圖,這裡四幅圖大小要一致,以下是四種狀體的按鈕,若讀者要實驗這次的設計的話,可以右鍵另存為,然後用“畫圖”把png格式的另存為bmp格式的。在資源視圖,右鍵“添加資源”,“導入”以下圖片:
步驟三:初始化工作,在對話框的OnInitDialog()函數裡面添加以下代碼:
m_btButton.LoadBitmaps(IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3,IDB_BITMAP4); //載入 m_btButton.SizeToContent(); //使按鈕適應圖片大小
步驟四:為控制位圖按鈕的可用、不可用添加代碼,這是為了驗證第四種狀態的按鈕:
void CTestDlg::OnBnClickedButton2() { m_btButton.EnableWindow(0); } void CTestDlg::OnBnClickedButton3() { m_btButton.EnableWindow(); }
步驟五:到這裡已經完成了位圖按鈕的實現,編譯運行可以看到結果。但是鼠標滑過的時候,按鈕並不會感應到焦點的存在。這裡用定時器捕獲焦點在按鈕上,並且改變此時的按鈕狀體為第三種圖片。首先為窗體添加OnTimer()事件,在OnTimer()函數裡面填寫如下代碼:
void CTestDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 if (1==nIDEvent) { POINT p; GetCursorPos(&p); CWnd *hwnd; hwnd=WindowFromPoint(p); //檢索窗口中包含指定的點;點必須指定屏幕坐標在屏幕上的一個點。 CWnd *hwnd2=GetDlgItem(IDC_BUTTON1); if (hwnd2 == hwnd) //如果鼠標在按鈕上 { if (GetFocus()!=hwnd2) //如果按鈕無焦點,那麼設置焦點 hwnd2->SetFocus() ; } else //如果鼠標不在按鈕上; { if (GetFocus() == hwnd2 ) //如果按鈕有焦點,那麼去焦點; GetDlgItem(IDC_BUTTON2)->SetFocus(); //這裡的IDC_BUTTON2為你想跳轉到的控件ID號 } } CDialog::OnTimer(nIDEvent); }
最後在對話框的OnInitDialog()函數裡面添加開啟定時器,時間間隔200ms足夠了。
SetTimer(1,200,NULL);
完成後,運行就可實現與文章開頭所示的圖片一樣的效果。