我正在开发一个带有分组复选框的程序,并对这些消息如何通过不同的句柄传达感到困惑。
IDE:VC ++,Win32 API
首先,我有一个主窗口,有一个句柄,比如 hWnd 。
在WM_CREATE案例的WndProc函数中,我们创建了“组按钮”和单独的2个复选框
注意:第一个按钮使用“BS_GROUPBOX”样式,它是使用句柄 hGrpButton 创建的,而其父处理程序是 hWnd 。第二个和第三个按钮是“BS_AUTORADIOBUTTON”样式,它的父句柄是 hGrpButton 。
如果2个按钮没有分组(因此它们的父母hanlder将是hWnd),很容易检查它们的状态。只需简单地转到WM_COMMAND案例并使用他们的ID来检查IsDlgButtonChecked函数。在两个复选框被分组后(它们的父句柄不再是hWnd而是hGrpButtons),我认为WM_COMMAND不会找到它们的ID,因为它正在hWnd下查找ID。
简而言之,在对2个复选框进行分组后,我不知道监控它们的事件是什么。
case WM_CREATE:
{
/*Group for Radio button for preview/single or batch operation */
hGrpButtons=CreateWindowEx(WS_EX_WINDOWEDGE,
L"BUTTON",
L"Select Process Mode:",
WS_VISIBLE | WS_CHILD|BS_GROUPBOX, // Styles
10,280,
350,100,
hWnd,
NULL,
hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
L"BUTTON",
L"Batch Process Mode",
WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON, // Styles
10,20,
300,20,
hGrpButtons,
(HMENU)IDC_CHK1,
hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
L"BUTTON",
L"Single Process Mode (Preview Mode)",
WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON, // Styles
10,45,
300,20,
hGrpButtons,
(HMENU)IDC_CHK2,
hInst, NULL);
答案 0 :(得分:11)
在阅读了Coder_Dan的评论和MSDN文章“http://msdn.microsoft.com/en-us/library/bb775947(v=vs.85).aspx#related_topics”关于按钮类型之后,我终于将其排序了。
BS_GROUPBOX只是一个“眼睛糖果”,并没有贡献给收音机盒组!控制分组的关键参数是“WS_GROUP”
如何对收音机框进行分组:将WS_GROUP置于第一个单选按钮的样式中。它会将当前的单选按钮分组,直到它看到Coder_Dan提到的第二个WS_GROUP。
对我之前代码的修改
一个。使用hWnd作为所有4个单选按钮的父级
湾将WS_GROUP放在第一个和第三个按钮样式中,以便我们将1,2和3,4单选按钮分组
℃。现在你可以转到WM_COMMAND,并根据主窗口句柄hWnd
下的ID来收听4个按钮的消息。 case WM_CREATE:
{
/*Group for Radio button for preview/single or batch operation */
hGrpButtons=CreateWindowEx(WS_EX_WINDOWEDGE,
L"BUTTON",
L"Select Process Mode:",
WS_VISIBLE | WS_CHILD|BS_GROUPBOX,// <----BS_GROUPBOX does nothing on the grouping
10,280,
350,100,
hWnd,
(HMENU)IDC_GRPBUTTONS,
hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
L"BUTTON",
L"first radio button",
WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON|WS_GROUP, // <---- WS_GROUP group the following radio buttons 1st,2nd button
10,520,
300,20,
hWnd, //<----- Use main window handle
(HMENU)IDC_CHK1,
hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
L"BUTTON",
L"second radio button",
WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON, // Styles
10,545,
300,20,
hWnd,
(HMENU)IDC_CHK2,
hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
L"BUTTON",
L"third radio button",
WS_VISIBLE | WS_CHILD|BS_AUTOCHECKBOX|WS_GROUP, //<---Start second group for 3rd,4th button
10,570,
300,20,
hWnd,
(HMENU)IDC_CHK3,
hInst, NULL);
CreateWindowEx(WS_EX_WINDOWEDGE,
L"BUTTON",
L"forth radio button",
WS_VISIBLE | WS_CHILD|BS_AUTORADIOBUTTON, // Styles
500,545,
300,20,
hWnd,
(HMENU)IDC_CHK4,
hInst, NULL);