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