我正在开发一个带有分组复选框的程序,我对消息如何通过不同的句柄传达感到困惑。
IDE:VC++, Win32 API
首先,我有一个带有句柄的主窗口,例如 hWnd。
并且在 WndProc 函数中,在 WM_CREATE 情况下,我们创建了“组按钮”和单独的 2 个复选框
注意:第一个按钮使用“BS_GROUPBOX”风格,它是用句柄hGrpButton创建的,而它的父句柄是hWnd。第二个和第三个按钮是“BS_AUTORADIOBUTTON”样式,它的父句柄是hGrpButton。
如果这 2 个按钮没有分组(所以它们的父 hanlder 将是 hWnd),很容易检查它们的状态。只需转到案例 WM_COMMAND 并使用其 ID 来检查 IsDlgButtonChecked 函数。将两个复选框分组后(它们的父句柄不再是 hWnd,而是 hGrpButtons),我认为 WM_COMMAND 案例不会找到它们的 ID,因为它正在寻找 hWnd 下的 ID。
总之就是2个check box分组后,不知道监听什么事件
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);
最佳答案
看了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 下的 4 个按钮的 ID 收听消息
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);
关于c++ - 如何使用 Win32 API 对单选框按钮进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187265/