按鈕控件簡介

       按鈕控件包括命令按鈕(Button)、單選按鈕(Radio Button)和復(fù)選框(Check Box)等。命令按鈕就是我們前面多次提到的狹義的按鈕控件,用來響應(yīng)用戶的鼠標(biāo)單擊操作,進(jìn)行相應(yīng)的處理,它可以顯示文本也可以嵌入位圖。單選按鈕使用時,一般是多個組成一組,組中每個單選按鈕的選中狀態(tài)具有互斥關(guān)系,即同組的單選按鈕只能有一個被選中。

       命令按鈕是我們最熟悉也是最常用的一種按鈕控件,而單選按鈕和復(fù)選框都是一種比較特殊的按鈕控件。單選按鈕有選中和未選中兩種狀態(tài),為選中狀態(tài)時單選按鈕中心會出現(xiàn)一個藍(lán)點(diǎn),以標(biāo)識選中狀態(tài)。一般的復(fù)選框也是有選中和未選中兩種狀態(tài),選中時復(fù)選框內(nèi)會增加一個“√”,而三態(tài)復(fù)選框(設(shè)置了BS_3STATE風(fēng)格)有選中、未選中和不確定三種狀態(tài),不確定狀態(tài)時復(fù)選框內(nèi)出現(xiàn)一個灰色“√”。

       按鈕控件會向父窗口發(fā)送通知消息,最常用的通知消息莫過于BN_CLICKED和BN_DOUBLECLICKED了。用戶在按鈕上單擊鼠標(biāo)時會向父窗口發(fā)送BN_CLICKED消息,雙擊鼠標(biāo)時發(fā)送BN_DOUBLECLICKED消息。

       按鈕控件的創(chuàng)建

       MFC提供了CButton類封裝按鈕控件的所有操作。

       之前的教程中,我們是在對話框模板上直接添加的按鈕控件資源,但某些特殊情況下需要我們動態(tài)創(chuàng)建按鈕控件,即通過CButton類的成員函數(shù)Create來創(chuàng)建按鈕。下面是Create函數(shù)的原型:

virtual BOOL Create(
   LPCTSTR lpszCaption,
   DWORD dwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT nID
);

       參數(shù)說明:

       lpszCaption:指定按鈕控件顯示的文本。

       dwStyle:指定按鈕控件的風(fēng)格,可以設(shè)置為以下按鈕風(fēng)格的任意組合。

       BS_AUTOCHECKBOX :同BS_CHECKBOX,不過單擊鼠標(biāo)時按鈕會自動反轉(zhuǎn)
       BS_AUTORADIOBUTTON: 同BS_RADIOBUTTON,不過單擊鼠標(biāo)時按鈕會自動反轉(zhuǎn)
       BS_AUTO3STATE :同BS_3STATE,不過單擊按鈕時會改變狀態(tài)
       BS_CHECKBOX:指定在矩形按鈕右側(cè)帶有標(biāo)題的選擇框
       BS_DEFPUSHBUTTON:指定默認(rèn)的命令按鈕,這種按鈕的周圍有一個黑框,用戶可以按回車鍵來快速選擇該按鈕
       BS_GROUPBOX:指定一個組框
       BS_LEFTTEXT:使控件的標(biāo)題顯示在按鈕的左邊
       BS_OWNERDRAW:指定一個自繪式按鈕
       BS_PUSHBUTTON:指定一個命令按鈕
       BS_RADIOBUTTON:指定一個單選按鈕,在圓按鈕的右邊顯示正文
       BS_3STATE:同BS_CHECKBOX,不過控件有3 種狀態(tài)—選擇、未選擇和變灰

       當(dāng)然,除了以上列出的風(fēng)格,一般還會為按鈕設(shè)置WS_CHILD、WS_VISIBLE和WS_TABSTOP等風(fēng)格,WS_TABSTOP風(fēng)格使按鈕控件具有tab停止屬性,即按tab鍵切換焦點(diǎn)控件時能夠?qū)⒔裹c(diǎn)停在按鈕控件上。創(chuàng)建一組單選按鈕時,第一個按鈕的風(fēng)格應(yīng)設(shè)置為WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP|BS_AUTORADIOBUTTON,其他單選按鈕的風(fēng)格應(yīng)為WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,不包含WS_TABSTOP和WS_GROUP。

       在對話框模板上直接添加按鈕控件時,它的屬性中包含了上述風(fēng)格,例如,復(fù)選框的Tri_state屬性實(shí)際上代表的就是BS_3STATE風(fēng)格。

       剩下的三個參數(shù)與靜態(tài)文本框的Create函數(shù)中的相應(yīng)參數(shù)類似,大家可以參考前面靜態(tài)文本框的講解,也可以查閱MSDN。

 

       CButton類的主要成員函數(shù)

       下面是CButton類的一些主要的成員函數(shù),至于其他的函數(shù)大家可以在MSDN中查看。

       HBITMAP SetBitmap(HBITMAP hBitmap);

       設(shè)置要在按鈕中顯示的位圖。參數(shù)hBitmap為位圖的句柄。返回值為按鈕原來位圖的句柄。

       HBITMAP GetBitmap( ) const;

       獲取之前由SetBitmap函數(shù)設(shè)置的按鈕位圖的句柄。

       void SetButtonStyle(UINT nStyle,BOOL bRedraw = TRUE);

       設(shè)置按鈕的風(fēng)格。參數(shù)nStyle指定按鈕的風(fēng)格,bRedraw指定按鈕是否重繪,為TRUE則重繪,否則不重繪,默認(rèn)為重繪。 

       UINT GetButtonStyle( ) const;

       獲取按鈕控件的風(fēng)格。

       void SetCheck(int nCheck);

       設(shè)置按鈕的選擇狀態(tài)。參數(shù)nCheck為0表示未選中狀態(tài),1表示選中狀態(tài),2表示不確定狀態(tài)(僅用于復(fù)選框)。

       int GetCheck( ) const;

       獲取按鈕的選擇狀態(tài)。返回值的意義同SetCheck函數(shù)的nCheck參數(shù)。

       HCURSOR SetCursor(HCURSOR hCursor);

       設(shè)置要顯示到按鈕上的光標(biāo)圖。參數(shù)hCursor指定了光標(biāo)的句柄。返回值為按鈕原來光標(biāo)的句柄。

       HCURSOR GetCursor( );

       獲取之前由SetCursor設(shè)置的光標(biāo)的句柄。

       HICON SetIcon(HICON hIcon);

       設(shè)置要在按鈕上顯示的圖標(biāo)。參數(shù)hIcon指定了圖標(biāo)的句柄。返回值為按鈕原來圖標(biāo)的句柄。

       HICON GetIcon( ) const;

       獲取之前由SetIcon設(shè)置的圖標(biāo)的句柄。

       void SetState(BOOL bHighlight);

       設(shè)置按鈕的高亮狀態(tài)。參數(shù)bHighlight指定按鈕是否高亮顯示,非0則高亮顯示,否則取消高亮顯示狀態(tài)。

       UINT GetState( ) const;

       獲取按鈕控件的選擇狀態(tài)、高亮狀態(tài)和焦點(diǎn)狀態(tài)。我們可以通過將返回值與各個掩碼相與來獲得各種狀態(tài)值,掩碼與對應(yīng)的相與結(jié)果說明如下:

       掩碼0x0003:用來獲取單選按鈕或復(fù)選框的狀態(tài)。相與結(jié)果為0表示未選中,1表示被選中,2表示不確定狀態(tài)(僅用于復(fù)選框)。
       掩碼0x0004:用來判斷按鈕是否是高亮顯示。相與結(jié)果為非0值表示按鈕是高亮顯示的。當(dāng)單擊按鈕并按住鼠標(biāo)左鍵時,按鈕會呈高亮顯示。
       掩碼0x0008:相與結(jié)果為非零值表示按鈕擁有輸入焦點(diǎn)。

       下面再列出幾個繼承自CWnd類的成員函數(shù),通過它們獲取或設(shè)置按鈕控件的狀態(tài)非常方便,只需要知道按鈕的ID。

       void CheckDlgButton(int nIDButton,UINT nCheck);

       用來設(shè)置按鈕的選擇狀態(tài)。參數(shù)nIDButton指定了按鈕的ID。nCheck的值為0表示按鈕未被選擇,為1表示按鈕被選擇,為2表示按鈕處于不確定狀態(tài)(僅用于復(fù)選框)。

       UINT IsDlgButtonChecked(int nIDButton) const;

       返回復(fù)選框或單選按鈕的選擇狀態(tài)。返回值為0表示按鈕未被選擇,為1表示按鈕被選擇,為2表示按鈕處于不確定狀態(tài)(僅用于復(fù)選框)。

       void CheckRadioButton(int nIDFirstButton,int nIDLastButton,int nIDCheckButton);

       用來選擇組中的一個單選按鈕。參數(shù)nIDFirstButton指定了組中第一個按鈕的ID,nIDLastButton指定了組中最后一個按鈕的ID,nIDCheckButton指定了要選擇的按鈕的ID。

       int GetCheckedRadioButton(int nIDFirstButton, int nIDLastButton);

       用來獲得一組單選按鈕中被選中按鈕的ID。參數(shù)nIDFirstButton 說明了組中第一個按鈕的ID,nIDLastButton 說明了組中最后一個按鈕的ID。

       另外,CWnd類的成員函數(shù)GetWindowText()、SetWindowText()等也可以用來獲取或設(shè)置按鈕中顯示的文本。