基礎介紹:html
radio button一般都是成組使用的,在一組裏面是互斥的。編程
分組的原則是:框架
1、首先將RadioButton控件定好Tab順序,具體方法:工具欄「格式」—>「Tab鍵順序」選項選中,而後按照預約的順序依次點擊對話框上面的RadioButton按鈕,Tab鍵順序設定完成。ide
2、按照上面的Tab鍵順序進行分組,而後設定每組第一個RadioButton的Group屬性爲TRUE,分組完成,即從當前設置Group屬性爲TRUE的RadioButton開始直到碰到下一個選上Group屬性的RadioButton的前一個RadioButton爲一個組。函數
3、爲單選控件定義Control變量或Value變量,每組只能定義一個,經過設定值來肯定哪個RadioButton被選中,其中-1表示該組均不被選中,0表示該組第一個RadioButton被選中,1表示第二個……)。工具
環境:Visual Studio2010url
以對話框爲例,工程名稱爲:RadioButtonInstance。此工程中,共建立四組RadioButton,記着設定Tab鍵順序以及爲每組第一個RadioButton設置Group屬性。初始化對話框爲下圖:spa
爲該工程中的RadioButton設定下面若干變量:(爲單選控件定義Control變量或Value變量,每組只能定義一個)orm
BOOL m_Radio1;//對應於組 1 1htm
BOOL m_Radio3; //對應於組 2 1
BOOL m_Radio7; //對應於組 3 1
BOOL m_Radio9; //對應於組 4 1
CButton m_RBtGroup1; //對應於組 1 1
CButton m_RBtGroup2; //對應於組 2 1
CButton m_RBtGroup3; //對應於組 3 1
CButton m_RBtGroup4; //對應於組 4 1
添加變量
方法一:利用類嚮導方法添加變量(略)
方法二:直接編程以下
RadioButtonInstanceDlg.h文件中:
代碼部分以下
class CRadioButtonInstanceDlg : public CDialogEx
{
// 構造
public:
CRadioButtonInstanceDlg(CWnd* pParent = NULL); // 標準構造函數
// 對話框數據
enum { IDD = IDD_RADIOBUTTONINSTANCE_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 實現
protected:
HICON m_hIcon;
// 生成的消息映射函數
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
BOOL m_Radio1;
BOOL m_Radio3;
BOOL m_Radio7;
BOOL m_Radio9;
CButton m_RBtGroup1;
CButton m_RBtGroup2;
CButton m_RBtGroup3;
CButton m_RBtGroup4;
};
RadioButtonInstanceDlg.cpp文件中:
void CRadioButtonInstanceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Radio(pDX, IDC_RADIO1, m_Radio1);
DDX_Radio(pDX, IDC_RADIO3, m_Radio3);
DDX_Radio(pDX, IDC_RADIO7, m_Radio7);
DDX_Radio(pDX, IDC_RADIO9, m_Radio9);
DDX_Control(pDX, IDC_RADIO1, m_RBtGroup1);
DDX_Control(pDX, IDC_RADIO3, m_RBtGroup2);
DDX_Control(pDX, IDC_RADIO7, m_RBtGroup3);
DDX_Control(pDX, IDC_RADIO9, m_RBtGroup4);
}
問題一:如何更改RadioButton默認值???
方法1
在定義控件變量時,默認變量初值爲-1,表示此組的任何RadioButton均不被選中,若是須要改變初始默認按鈕的設置狀況,只須要在對話框的構造函數中把變量初值設爲相應的變量值便可。下面附代碼和效果圖
例如 構造函數:
CRadioButtonInstanceDlg::CRadioButtonInstanceDlg(CWnd* pParent )
: CDialogEx(CRadioButtonInstanceDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//設置RadioButton初始默認值。若是此處不設置,那麼默認值均爲-1,即任何一個RadioButton均不被選中
m_Radio1=-1;
m_Radio3=3;
m_Radio7=1;
m_Radio9=0;
}
效果圖以下:
方法2
只須要在對話框的OnInitDialog()方法中添加下面代碼中綠色的部分便可。
BOOL CRadioButtonInstanceDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 將「關於...」菜單項添加到系統菜單中。
// IDM_ABOUTBOX 必須在系統命令範圍內。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
// 執行此操做
SetIcon(m_hIcon, TRUE); // 設置大圖標
SetIcon(m_hIcon, FALSE); // 設置小圖標
// TODO: 在此添加額外的初始化代碼
//此種方法能夠爲任何一個RadioButton設置其「是否check」狀態,未指定的均爲不選上狀態
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//選上
((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(FALSE);// 不選上
((CButton *)GetDlgItem(IDC_RADIO4))->SetCheck(TRUE);//選上
((CButton *)GetDlgItem(IDC_RADIO8))->SetCheck(TRUE);//選上
((CButton *)GetDlgItem(IDC_RADIO9))->SetCheck(TRUE);//選上
return TRUE; // 除非將焦點設置到控件,不然返回 TRUE
}
效果圖以下:
方法3
單選控件每組只能定義個Control變量或Value變量。首先爲每一組RadioButton關聯一個Control變量,名字分別爲m_RBtGroup1、m_RBtGroup2、m_RBtGroup3、m_RBtGroup4。而後設定RadioButton初始狀態。
代碼以下:
BOOL CRadioButtonInstanceDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 將「關於...」菜單項添加到系統菜單中。
// IDM_ABOUTBOX 必須在系統命令範圍內。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
// 執行此操做
SetIcon(m_hIcon, TRUE); // 設置大圖標
SetIcon(m_hIcon, FALSE); // 設置小圖標
// TODO: 在此添加額外的初始化代碼
// //此種方法只能爲每一組的第一個RadioButton設置其「是否check」狀態
m_RBtGroup1.SetCheck(FALSE);
m_RBtGroup2.SetCheck(TRUE);
m_RBtGroup3.SetCheck(TRUE);
m_RBtGroup4.SetCheck(TRUE);
return TRUE; // 除非將焦點設置到控件,不然返回 TRUE
}
效果圖以下:
問題二:如何獲取RadioButton當前狀態???
獲取RadioButton是否選中的狀態方法以下:
方法一:能夠使用GetCheck()獲取狀態。
例如:
((CButton *)GetDlgItem(IDC_RADIO2))->GetCheck();//返回1表示選上,0表示沒選上
方法二:獲取狀態很簡單,UpdateData(TRUE)後判斷m_nRadio1的值便可。
例如:
UpdateData(TRUE);
CString m_R1;
m_R1.Format(_T("the value of m_Radio1 is %d"),m_Radio1);
AfxMessageBox(m_R1);
能夠根據須要爲RadioButton添加鼠標單擊事件
問題三:如何爲RadioButton添加單擊消息函數???
方法一:雙擊RadioButton按鈕,進入消息函數,而後添加相應的代碼。
方法二:用ClassWizard生成各單選按鈕的單擊消息函數,而後添加相應的代碼。
例如:
void CRadioButtonInstanceDlg::OnBnClickedRadio1()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio1=0; //選中此組的第一個RadioButton
CString m_R1;
m_R1.Format(_T("the value of m_Radio1 is %d"),m_Radio1);
AfxMessageBox(m_R1);
}
void CRadioButtonInstanceDlg::OnBnClickedRadio2()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio1=1;//選中此組的第二個RadioButton
UpdateData(FALSE);
}
void CRadioButtonInstanceDlg::OnBnClickedRadio3()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio3=0;//選中此組的第一個RadioButton
UpdateData(FALSE);
}
void CRadioButtonInstanceDlg::OnBnClickedRadio4()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio3=1;//選中此組的第二個RadioButton
UpdateData(FALSE);
}
void CRadioButtonInstanceDlg::OnBnClickedRadio5()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio3=2;//選中此組的第三個RadioButton
UpdateData(FALSE);
}
void CRadioButtonInstanceDlg::OnBnClickedRadio6()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio3=3;//選中此組的第四個RadioButton
UpdateData(FALSE);
}
void CRadioButtonInstanceDlg::OnBnClickedRadio7()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio7=0;//選中此組的第一個RadioButton
UpdateData(FALSE);
}
void CRadioButtonInstanceDlg::OnBnClickedRadio8()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio7=1;//選中此組的第二個RadioButton
UpdateData(FALSE);
}
void CRadioButtonInstanceDlg::OnBnClickedRadio9()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio9=0;//選中此組的第一個RadioButton
UpdateData(FALSE);
}
void CRadioButtonInstanceDlg::OnBnClickedRadio10()
{
// TODO: 在此添加控件通知處理程序代碼
m_Radio9=1;//選中此組的第二個RadioButton
UpdateData(FALSE);
}
轉載自:http://blog.sina.com.cn/s/blog_6988593e0101f9tw.html