單選鈕用來表示一系列的互斥選項,這些互斥項常常被分成若干個組,每組僅允許用戶選擇一個選項;復選框與單選按鈕相象,不同之處是復選框代表多重選擇,用戶可以選擇一個或多個選項。
對話框編輯器中各組控件的對齊
按下Ctrl鍵並單擊要對齊的各個控件,同時選中。最後選中的控件是對齊的基准,仔細觀察,它周圍的8個小方框是實心的,而其它被選控件周圍的小方框是空心的。
在Layout菜單中選擇Make Same Size的Both,可以統一控件尺寸,所選控件尺寸與基准控件相同。在Layout菜單中選擇Align的Left,可以使所有被選控件的左邊與基准控件對齊。選擇Layout菜單中Align的Space Evenly的Down,可以使被選控件垂直間距相等。
單選按鈕和復選框的使用
為了方便說明,我們假定創建了基於對話框的MFC應用程序,工程名為RadioAndCheckButton。對話框資源加入兩個組框 ,第一個組框‘性別’,內有‘男’,‘女’兩個單選鈕;第二個組框是‘愛好’,內有‘足球’‘排球’‘藍球’三個復選框,如下表:
控件類型 ID 標題(Caption) 其它屬性 組框 缺省 性別 缺省 單選鈕 IDC_SEX1 男 Group 單選鈕 IDC_SEX2 女 缺省 組框 缺省 愛好 缺省 復選框 IDC_HOBBY1 足球 缺省 復選框 IDC_HOBBY2 排球 缺省 復選框 IDC_HOBBY3 藍球 缺省設置控件的Tab Order
單擊Layout菜單下的Tab Order命令,設置控件的TAB鍵順序(Tab Order),保證單選鈕的Tab Order連續。
以Tab Order為序,從Group屬性為真的控件開始(包括該控件),到下一個Group屬性為真的控件結束(不包括該控件),所有的這些控件將組成一個組。對於單選鈕,同一組內同時只能有一個處於被選中狀態。對於由資源編輯器生成的單選按鈕控件,在默認情況由Windows自動處理同組控件之間的互斥關系。
具體使用單選鈕和復選框
1、調用 CButton的成員函數SetCheck設置單選鈕和復選框的選中狀態。該成員函數帶有一個類型為整形的參數,該參數為0表示清除選中按鈕的選中狀態,參數為1表示設置選中按鈕的選中狀態。參數為2表示把三態復選框設為不確定狀態。
復選框的Tristate屬性:創建三態復選框。除了處於“選中”和“不選中”狀態外,三態復選框還可以處於變灰狀態。通常,復選框的變灰狀態表示其選中狀態不確定。在很多軟件的安裝程序中,變灰往往表示僅選中該組件的一部分。
注意,如果我們在程序中調用SetCheck設置同一組中某一單選鈕為選中狀態,並不意味著同時清除同一組中其它單選鈕的選中狀態。否則,將導致同一組中的兩個按鈕同時處於選中狀態。這是應該避免的。因此,如果我們通過代碼改變了單選鈕的選中狀態,一定要記得同時清除同組的其它單選鈕的選中狀態。
2、調用 CButton的成員函數GetCheck返回單選鈕的選中狀態。該函數的函數原型是
int GetCheck( ) const;
返回值可以是0、1、2,分別代表按鈕處於未選中狀態、選中狀態或中間狀態(對三態復選框而言)。
3、調用類CWnd的成員函數GetCheckedRadioButton返回同一組單選鈕中哪一個被選中。該成員函數原型如下:
int GetCheckedRadioButton(int nIDFirstButton,int nIDLastButton);
第一個參數nIDFirstButton是同一組中的第一個單選鈕控件的ID,nIDLastButton是同一組中最後一個單選鈕控件的ID。成員函數GetCheckedRadioButton返回指定組中所選中的單選鈕的ID,如果沒有按扭被選中,則返回0。
注意,若干個單選鈕是否屬於同一組是以其Tab順序來排定的,而GetCheckedRadioButton函數是以ID順序來檢查按鈕的選定狀態的。因此,如果傳遞給函數GetCheckedRadioButton的第一個參數的值大於第二個參數的值時,其返回值總是為0,而事實上由這兩個參數指定的單選鈕的Tab順序可能恰恰相反。因此,一般情況下我們應該盡量保證同一組單選鈕的資源ID是連續遞增的。通常這些資源ID是在頭文件Resource.h中定義的。如果你同一組的單選鈕不是一次創建的,那麼它們的資源ID可能不是連續遞增的,甚至可能是相反的。我們可以手動的修改資源頭文件中的宏定義,以保證GetCheckedRadioButton函數得到正確的結果。
例:
UINT nSex=GetCheckedRadioButton(IDC_SEX1,IDC_SEX2);
Switch(nSex)
{
Case IDC_SEX1:
;
……
4、使用ClassWizard為單選鈕或復選框添加變量,來使用單選鈕或復選框
一般,一組單選按鈕的第一個屬性選中Group,注意,只有選中Group屬性的單選鈕的ID 才能在ClassWizard中添加變量。
在對話框類給一組單選鈕加入一個成員變量,單選鈕(組中的第一個按鈕)的數據變量類型是int,0表示選擇了組中的第一個單選鈕,1表示選擇了第二個,-1表示沒有一個被選中。例如:給單選鈕IDC_SEX1添加int型變量m_nSex,並在執行文件中加入如下代碼:
……
UpdateData(TRUE);
if(m_nSex==0) //選中‘男’
;
else if(m_nSex==1) //選中‘女’
;
else
;
……
復選框的數據變量類型是BOOL,TRUE表示選中,FALSE表示未選中。例如:給復選框IDC_HOBBY1添加BOOL型變量m_hobby1,並在執行文件中加入如下代碼:
……
m_hobby1=TRUE;
UpdateData(FALSE);
……
5、使用消息映射宏ON_CONTROL_RANGE
單選鈕和復選框都可以響應BN_CLICKED消息,如果一組中有多個單選鈕,分別創建消息處理函數就比較麻煩了,利用MFC的消息映射宏ON_CONTROL_RANGE可以避免這種麻煩,該映射宏把多個ID連續的控件發出的消息映射到同一個處理函數上,這樣,我們只要編寫一個消息處理函數就可以對一組單選鈕的BN_CLICKED消息作出響應,ClassWizard不支持該宏,必須手工創建。
ON_CONTROL_RANGE消息映射宏的第一個參數是控件消息碼,第二和第三個參數分別指明了一組連續的控件ID中的頭一個和最後一個ID,最後一個參數是消息處理函數名。注意,起始、 終止ID號必須是連續的,如果不能確定該組控件的ID是否是連續,請用View->Resource Symbols…命令檢查控件的ID值,如果發現兩個ID是不連續的,讀者可以改變對ID的定義值使之連續,但要注意改動後的值不要與別的ID值發生沖突。
在BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP之間 //}}AFX_MSG_MAP之後加入
ON_CONTROL_RANGE(BN_CLICKED,IDC_SEX1,IDC_SEX2,OnSexClicked)
然後在對話框類的頭文件的AFX_MSG 塊中聲明消息處理函數,
……
//{{AFX_MSG(CMyView)
……
//}}AFX_MSG
afx_msg void OnSexClicked (UINT nCmdID);
DECLARE_MESSAGE_MAP()
……
最後,在對話框類所在CPP文件的最後插入消息處理函數,如下所示:
CRadioAndCheckButtonDialog:: OnSexClicked,
void CRadioAndCheckButtonDialog:: OnSexClicked (UINT nCmdID)
{
……
switch(nID)
{
case IDC_SEX1:
AfxMessageBox("IDC_SEX1");
break;
case IDC_SEX2:
AfxMessageBox("IDC_SEX2");
break;
……
}
6、使用IsDlgButtonChecked 函數判斷單選鈕或復選框是否被選中
CWnd::IsDlgButtonChecked函數,用來判斷單選按鈕或檢查框是否被選擇,該函數的聲明為
UINT IsDlgButtonChecked(int nIDButton) const;
參數nIDButton為按鈕的ID。若按鈕被選擇,則函數返回1,否則返回0,若按鈕處於不確定狀態,則返回值為2。
……
if(IsDlgButtonChecked(IDC_SEX1))
……
以上是使用單選鈕和復選框最常用的幾種方法。