6

我正在开发一个带有分组复选框的程序,并且对消息如何通过不同的句柄传达感到困惑。

IDE:VC++,Win32 API

首先,我有一个主窗口,它有一个句柄,比如hWnd

在 WM_CREATE 案例下的 WndProc 函数中,我们创建“组按钮”和单独的 2 个复选框

注意:第一个按钮使用“BS_GROUPBOX”样式,它是使用句柄hGrpButton创建的,而其父处理程序是hWnd。第二个和第三个按钮是“BS_AUTORADIOBUTTON”样式,它的父句柄是hGrpButton

如果 2 个按钮未分组(因此它们的父处理程序将是 hWnd),则很容易检查它们的状态。只需转到 case 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);
4

1 回答 1

20

在阅读了 Coder_Dan 的评论和 MSDN 文章“ http://msdn.microsoft.com/en-us/library/bb775947(v=vs.85).aspx#related_topics ”关于按钮类型后,我终于整理出来了。

  1. BS_GROUPBOX 只是一个“眼睛糖果”,它对单选框的组没有任何贡献!控制分组的关键参数是“WS_GROUP”

  2. 如何对单选框进行分组:将 WS_GROUP 放在第一个单选按钮的样式中。它将对当前单选按钮进行分组,直到看到 Coder_Dan 提到的第二个 WS_GROUP。

修改我之前的代码

一个。使用 hWnd 作为所有 4 个单选按钮的父级

湾。将 WS_GROUP 放在第一个和第三个按钮样式中,以便我们将 1,2 和 3,4 单选按钮分组

C。现在你可以进入WM_COMMAND,并根据主窗口句柄hWnd下的4个按钮的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);
于 2013-06-22T18:39:09.110 回答