本文使用vc6.0 MFC程序實現自定義的多狀態button。vc9.0(即vs2008)下,去掉stdafx.h文件中的#define _WIN32_WINNT 0x0400 也可以運行(有個warning)。
由於只是示例,並沒有注意接口,您可以自己改;自己的美工水平不行,您可以自己更改bitmap資源。
介紹了三種多狀態按鈕 :
1)三狀態按鈕
鼠標在button上;鼠標在button外;鼠標按下button
2)六狀態按鈕
在1)的基礎上增加了對應的獲得焦點的三種情況
3)MFC自帶的CBitmapButton類
有四種狀態:up,down,focus,disabled。控件風格不同,狀態個數不同,具體可看msdn。
代碼可到此處下載:
http://download.csdn.net/source/986965
(一)三狀態按鈕
1)定義繼承自CButton的子類CyctBitmapButton。
2)三狀態需要三個位圖資源
裝在和卸載位圖資源:
3)初始化button
窗口初始化後需要調用Init()函數。布爾值變量m_fIsInit確保button只初始化一次。
4)處理鼠標響應函數(這是關鍵的)
處理了四種鼠標消息WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSELEAVE:
其中WM_MOUSELEAVE消息響應映射是手工添加的。
在頭文件中DECLARE_MESSAGE_MAP()前添加一句:
在對應的cpp文件中BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間添加一句:
WM_MOUSELEAVE消息是由函數TrackMouseEvent產生的,當鼠標離開button控件就會觸發此消息。
函數SetBitmap定義如下(具體的看源代碼吧):
5)如果想去掉按鈕button在獲得焦點時的虛框,重載WM_SETFOCUS消息,並且置函數體爲空即可。
(二)六狀態按鈕
與(一)類似,不再敘述。
(三)MFC自帶的CBitmapButton類
使用很簡單,在對話框類的OnInitDialog內裝載四個位圖資源即可:
總結:多狀態按鈕主要是使用函數TrackMouseEvent函數實現的。本文只是示例,很簡陋。你也可以下載CButtonST來看看,方法基本一樣。下載區有:
http://search.download.csdn.net/search/cbuttonst