MFC RadioButton用法详解
radio button通常都是成組使用的,在一組里面是互斥的。
分組的原則是:
1、首先將RadioButton控件定好Tab順序,具體方法:工具欄“格式”—>“Tab鍵順序”選項選中,然后按照預定的順序依次點擊對話框上面的RadioButton按鈕,Tab鍵順序設定完成。
2、按照上面的Tab鍵順序進行分組,然后設定每組第一個RadioButton的Group屬性為TRUE,分組完成,即從當前設置Group屬性為TRUE的RadioButton開始直到碰到下一個選上Group屬性的RadioButton的前一個RadioButton為一個組。
3、為單選控件定義Control變量或Value變量,每組只能定義一個,通過設定值來確定哪一個RadioButton被選中,其中-1表示該組均不被選中,0表示該組第一個RadioButton被選中,1表示第二個……)。
??
環境:Visual Studio2010
以對話框為例,工程名稱為:RadioButtonInstance。此工程中,共創建四組RadioButton,記著設定Tab鍵順序以及為每組第一個RadioButton設置Group屬性。初始化對話框為下圖:
為該工程中的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;
}
效果圖如下:
?
?
方法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);
}
總結
以上是生活随笔為你收集整理的MFC RadioButton用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab安装无效距离过远,求助mat
- 下一篇: linux脚本怎么把文件地址变成动态地址