radio button(进来的都有分加)

时间:2021-06-14 19:35:22
假如我有20个radio button,都是一组的.

要把20个按钮的情况保存到一个变量中.

难道要我添加20个单击事件?

高手帮忙化简之.

21 个解决方案

#1


这个按钮可以将第一个设置为group类型的,然后就可以用类向导添加一个整形变量,当你点击第一个按钮的时候,这个变量值为0,第二个为1……以此类推,直到遇见下一个类型为group的radio button

#2


将第一个radio button的group属性设为true,再添加一个变量,这个变量就和20个radio button关联了

#3


afx_msg void OnBtnClicked(UINT nCmdID); 

ON_CONTROL_RANGE(BN_CLICKED, IDC_.., IDC_.., ...); //注意ID号连续

#4


引用 1 楼 yibuyisheng 的回复:
这个按钮可以将第一个设置为group类型的,然后就可以用类向导添加一个整形变量,当你点击第一个按钮的时候,这个变量值为0,第二个为1……以此类推,直到遇见下一个类型为group的radio button


是控件变量吗?

类别为value的时候没有int选项啊.

只有bool类型的控件变量!

#5


引用楼主 ynwlgh 的回复:
假如我有20个radio button,都是一组的.

要把20个按钮的情况保存到一个变量中.

难道要我添加20个单击事件?

高手帮忙化简之.

你把你的第一个radio button的Group属性选中,然后,对这个radio button关联一个int类型的变量,就行了,

#6


大哥,请把你的代码发出来.

DDX怎么写的.

#7


用的2005吧
说来惭愧
一直不知道用向导怎么添加成组Radio的整型控制变量
都是手动添加的
类似
DDX_Radio(pDX, IDC_RADIO_FOLDER, m_nType);

#8


引用 1 楼 yibuyisheng 的回复:
这个按钮可以将第一个设置为group类型的,然后就可以用类向导添加一个整形变量,当你点击第一个按钮的时候,这个变量值为0,第二个为1……以此类推,直到遇见下一个类型为group的radio button

给第一个添加变量

#9


设为一个GROUP

#10


引用 4 楼 ynwlgh 的回复:
引用 1 楼 yibuyisheng 的回复:

这个按钮可以将第一个设置为group类型的,然后就可以用类向导添加一个整形变量,当你点击第一个按钮的时候,这个变量值为0,第二个为1……以此类推,直到遇见下一个类型为group的radio button


是控件变量吗?

类别为value的时候没有int选项啊.

只有bool类型的控件变量!
应该可以手动输入变量类型的吧~

#11


选择第一个radio,选择属性里的“组”,然后进入类向导,给这个radio添加一个变量,如:m_radio1.
在消息响应函数中判断,具体代码:

if (m_radio1==0)//选择第一个radio
{
fun1(); //选择第一个radio时的操作
}
        else if(m_radio1==1)//选择第二个radio
        {
                fun2();//选择第二个radio时的操作
        }
        //....依次类推,直到
         else if(m_radio1==19) //选择第20个radio
               fun20();  //选择第20个radio时的操作

#12


那么多的IF,ELSE IF,用switch不好么?

#13


void CAdvEditDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAdvEditDemoDlg)
DDX_Control(pDX, IDC_EDIT2, m_edt2);
DDX_Control(pDX, IDC_EDIT1, m_edt);
//}}AFX_DATA_MAP
for(int i = 0; i < 7; i ++)
DDX_Control(pDX, IDC_EDIT3 + i, m_AdvEdit[i]);
}
参照上面的方法,处理一下了。

那个是处理EDIT控件的,共有7个。m_AdvEdit[i]是7个CEdit对象了。

#14


哈哈 还可以这么用 顶楼上

#15


无需20个,
afx_msg void OnBtnClicked(UINT nCmdID); 

ON_CONTROL_RANGE(BN_CLICKED, IDC_.., IDC_.., ...); //注意ID号连续

这20个控件的ID必须为连续的就行

#16


设为一个GROUP

#17


引用 2 楼 galoss 的回复:
将第一个radio button的group属性设为true,再添加一个变量,这个变量就和20个radio button关联了

在要获取 变量值时前增加 函数UpdateData(TRUE);不然获取的不是最新的值.

#18


引用 15 楼 tht228 的回复:
无需20个,
afx_msg void OnBtnClicked(UINT nCmdID); 

ON_CONTROL_RANGE(BN_CLICKED, IDC_.., IDC_.., ...); //注意ID号连续

这20个控件的ID必须为连续的就行

学习 好强大

#19


这个我也不知道 很抱歉 我也是一个个添加的 我当是来学习了

#20


void AFXAPI DDX_Radio(CDataExchange* pDX, int nIDC, int& value)
// must be first in a group of auto radio buttons
{
pDX->PrepareCtrl(nIDC);
   HWND hWndCtrl;
   pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);

ASSERT(::GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP);
ASSERT(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON);

if (pDX->m_bSaveAndValidate)
value = -1;     // value if none found

// walk all children in group
int iButton = 0;
do
{
if (::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON)
{
// control in group is a radio button
if (pDX->m_bSaveAndValidate)
{                      
if (::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L) != 0)
{                           
ASSERT(value == -1);    // only set once
value = iButton;     
}
}
else
{
// select button
::SendMessage(hWndCtrl, BM_SETCHECK, (iButton == value), 0L);
}       //第三个变量1为BST_CHECKED,0为BST_UNCHECHKED
iButton++;
}
else
{
TRACE(traceAppMsg, 0, "Warning: skipping non-radio button in group.\n");
}
hWndCtrl = ::GetWindow(hWndCtrl, GW_HWNDNEXT);

} while (hWndCtrl != NULL &&
!(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP));
}

由上可知,一个组内的radio button是可以通过一个int变量存值的.哈哈

正确方法:
DDX_Radio(pDX, IDC_RADIO3, m_nTextRadio);
int m_nTextRadio;            //就可以了.
//bool m_nTextRadio;           //或者是这个,只能保存最多二个radio的值...

具体方法:选中一组radio button的"头",右键添加value控件变量的时候,里面下拉框只会出现BOOL类型的选项.
          不过可以那个编辑框可以手动输入为int
          

#21



void AFXAPI DDX_Radio(CDataExchange* pDX, int nIDC, int& value)
// must be first in a group of auto radio buttons
{
pDX->PrepareCtrl(nIDC);
  HWND hWndCtrl;
  pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);

ASSERT(::GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP);
ASSERT(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON);

if (pDX->m_bSaveAndValidate)
value = -1; // value if none found

// walk all children in group
int iButton = 0;
do
{
if (::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON)
{
// control in group is a radio button
if (pDX->m_bSaveAndValidate)
{  
if (::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L) != 0)
{  
ASSERT(value == -1); // only set once
value = iButton;  
}
}
else
{
// select button
::SendMessage(hWndCtrl, BM_SETCHECK, (iButton == value), 0L);
} //第三个变量1为BST_CHECKED,0为BST_UNCHECHKED
iButton++;
}
else
{
TRACE(traceAppMsg, 0, "Warning: skipping non-radio button in group.\n");
}
hWndCtrl = ::GetWindow(hWndCtrl, GW_HWNDNEXT);

} while (hWndCtrl != NULL &&
!(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP));
}

#1


这个按钮可以将第一个设置为group类型的,然后就可以用类向导添加一个整形变量,当你点击第一个按钮的时候,这个变量值为0,第二个为1……以此类推,直到遇见下一个类型为group的radio button

#2


将第一个radio button的group属性设为true,再添加一个变量,这个变量就和20个radio button关联了

#3


afx_msg void OnBtnClicked(UINT nCmdID); 

ON_CONTROL_RANGE(BN_CLICKED, IDC_.., IDC_.., ...); //注意ID号连续

#4


引用 1 楼 yibuyisheng 的回复:
这个按钮可以将第一个设置为group类型的,然后就可以用类向导添加一个整形变量,当你点击第一个按钮的时候,这个变量值为0,第二个为1……以此类推,直到遇见下一个类型为group的radio button


是控件变量吗?

类别为value的时候没有int选项啊.

只有bool类型的控件变量!

#5


引用楼主 ynwlgh 的回复:
假如我有20个radio button,都是一组的.

要把20个按钮的情况保存到一个变量中.

难道要我添加20个单击事件?

高手帮忙化简之.

你把你的第一个radio button的Group属性选中,然后,对这个radio button关联一个int类型的变量,就行了,

#6


大哥,请把你的代码发出来.

DDX怎么写的.

#7


用的2005吧
说来惭愧
一直不知道用向导怎么添加成组Radio的整型控制变量
都是手动添加的
类似
DDX_Radio(pDX, IDC_RADIO_FOLDER, m_nType);

#8


引用 1 楼 yibuyisheng 的回复:
这个按钮可以将第一个设置为group类型的,然后就可以用类向导添加一个整形变量,当你点击第一个按钮的时候,这个变量值为0,第二个为1……以此类推,直到遇见下一个类型为group的radio button

给第一个添加变量

#9


设为一个GROUP

#10


引用 4 楼 ynwlgh 的回复:
引用 1 楼 yibuyisheng 的回复:

这个按钮可以将第一个设置为group类型的,然后就可以用类向导添加一个整形变量,当你点击第一个按钮的时候,这个变量值为0,第二个为1……以此类推,直到遇见下一个类型为group的radio button


是控件变量吗?

类别为value的时候没有int选项啊.

只有bool类型的控件变量!
应该可以手动输入变量类型的吧~

#11


选择第一个radio,选择属性里的“组”,然后进入类向导,给这个radio添加一个变量,如:m_radio1.
在消息响应函数中判断,具体代码:

if (m_radio1==0)//选择第一个radio
{
fun1(); //选择第一个radio时的操作
}
        else if(m_radio1==1)//选择第二个radio
        {
                fun2();//选择第二个radio时的操作
        }
        //....依次类推,直到
         else if(m_radio1==19) //选择第20个radio
               fun20();  //选择第20个radio时的操作

#12


那么多的IF,ELSE IF,用switch不好么?

#13


void CAdvEditDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAdvEditDemoDlg)
DDX_Control(pDX, IDC_EDIT2, m_edt2);
DDX_Control(pDX, IDC_EDIT1, m_edt);
//}}AFX_DATA_MAP
for(int i = 0; i < 7; i ++)
DDX_Control(pDX, IDC_EDIT3 + i, m_AdvEdit[i]);
}
参照上面的方法,处理一下了。

那个是处理EDIT控件的,共有7个。m_AdvEdit[i]是7个CEdit对象了。

#14


哈哈 还可以这么用 顶楼上

#15


无需20个,
afx_msg void OnBtnClicked(UINT nCmdID); 

ON_CONTROL_RANGE(BN_CLICKED, IDC_.., IDC_.., ...); //注意ID号连续

这20个控件的ID必须为连续的就行

#16


设为一个GROUP

#17


引用 2 楼 galoss 的回复:
将第一个radio button的group属性设为true,再添加一个变量,这个变量就和20个radio button关联了

在要获取 变量值时前增加 函数UpdateData(TRUE);不然获取的不是最新的值.

#18


引用 15 楼 tht228 的回复:
无需20个,
afx_msg void OnBtnClicked(UINT nCmdID); 

ON_CONTROL_RANGE(BN_CLICKED, IDC_.., IDC_.., ...); //注意ID号连续

这20个控件的ID必须为连续的就行

学习 好强大

#19


这个我也不知道 很抱歉 我也是一个个添加的 我当是来学习了

#20


void AFXAPI DDX_Radio(CDataExchange* pDX, int nIDC, int& value)
// must be first in a group of auto radio buttons
{
pDX->PrepareCtrl(nIDC);
   HWND hWndCtrl;
   pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);

ASSERT(::GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP);
ASSERT(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON);

if (pDX->m_bSaveAndValidate)
value = -1;     // value if none found

// walk all children in group
int iButton = 0;
do
{
if (::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON)
{
// control in group is a radio button
if (pDX->m_bSaveAndValidate)
{                      
if (::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L) != 0)
{                           
ASSERT(value == -1);    // only set once
value = iButton;     
}
}
else
{
// select button
::SendMessage(hWndCtrl, BM_SETCHECK, (iButton == value), 0L);
}       //第三个变量1为BST_CHECKED,0为BST_UNCHECHKED
iButton++;
}
else
{
TRACE(traceAppMsg, 0, "Warning: skipping non-radio button in group.\n");
}
hWndCtrl = ::GetWindow(hWndCtrl, GW_HWNDNEXT);

} while (hWndCtrl != NULL &&
!(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP));
}

由上可知,一个组内的radio button是可以通过一个int变量存值的.哈哈

正确方法:
DDX_Radio(pDX, IDC_RADIO3, m_nTextRadio);
int m_nTextRadio;            //就可以了.
//bool m_nTextRadio;           //或者是这个,只能保存最多二个radio的值...

具体方法:选中一组radio button的"头",右键添加value控件变量的时候,里面下拉框只会出现BOOL类型的选项.
          不过可以那个编辑框可以手动输入为int
          

#21



void AFXAPI DDX_Radio(CDataExchange* pDX, int nIDC, int& value)
// must be first in a group of auto radio buttons
{
pDX->PrepareCtrl(nIDC);
  HWND hWndCtrl;
  pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);

ASSERT(::GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP);
ASSERT(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON);

if (pDX->m_bSaveAndValidate)
value = -1; // value if none found

// walk all children in group
int iButton = 0;
do
{
if (::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON)
{
// control in group is a radio button
if (pDX->m_bSaveAndValidate)
{  
if (::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L) != 0)
{  
ASSERT(value == -1); // only set once
value = iButton;  
}
}
else
{
// select button
::SendMessage(hWndCtrl, BM_SETCHECK, (iButton == value), 0L);
} //第三个变量1为BST_CHECKED,0为BST_UNCHECHKED
iButton++;
}
else
{
TRACE(traceAppMsg, 0, "Warning: skipping non-radio button in group.\n");
}
hWndCtrl = ::GetWindow(hWndCtrl, GW_HWNDNEXT);

} while (hWndCtrl != NULL &&
!(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP));
}