MFC RadioButton用法詳解

基礎介紹:

radio button通常都是成組使用的,在一組裏面是互斥的。

分組的原則是:

1、首先將RadioButton控件定好Tab順序,具體方法:工具欄“格式”—>Tab鍵順序”選項選中,然後按照預定的順序依次點擊對話框上面的RadioButton按鈕,Tab鍵順序設定完成。

2、按照上面的Tab鍵順序進行分組,然後設定每組第一個RadioButtonGroup屬性爲TRUE,分組完成,即從當前設置Group屬性爲TRUERadioButton開始直到碰到下一個選上Group屬性的RadioButton的前一個RadioButton爲一個組。

3、爲單選控件定義Control變量或Value變量,每組只能定義一個,通過設定值來確定哪一個RadioButton被選中,其中-1表示該組均不被選中,0表示該組第一個RadioButton被選中,1表示第二個……)。

  

環境:Visual Studio2010

以對話框爲例,工程名稱爲:RadioButtonInstance。此工程中,共創建四組RadioButton,記着設定Tab鍵順序以及爲每組第一個RadioButton設置Group屬性。初始化對話框爲下圖:

MFC <wbr> <wbr>RadioButton用法詳解
爲該工程中的RadioButton設定下面若干變量:(爲單選控件定義Control變量或Value變量,每組只能定義一個)

BOOL m_Radio1;//對應於組 1 1

       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;

}

效果圖如下:

 

 MFC <wbr> <wbr>RadioButton用法詳解



方法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

}

 

效果圖如下:

 

 MFC <wbr> <wbr>RadioButton用法詳解

方法3

單選控件每組只能定義個Control變量或Value變量。首先爲每一組RadioButton關聯一個Control變量,名字分別爲m_RBtGroup1m_RBtGroup2m_RBtGroup3m_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

}

 

效果圖如下:

MFC <wbr> <wbr>RadioButton用法詳解

 

問題二:如何獲取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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章