如何使用Win32 API对单选框按钮进行分组

6
我正在开发一个带有分组复选框的程序,但在不同句柄之间传递消息时感到困惑。
集成开发环境为VC++,Win32 API。
首先,我有一个主窗口,它有一个句柄,称为hWnd。
在WM_CREATE情况下的WndProc函数中,我们创建了“组合按钮”和单独的2个复选框。
注意:第一个按钮使用“BS_GROUPBOX”样式,并且是使用句柄hGrpButton创建的,而其父处理程序是hWnd。第二个和第三个按钮是“BS_AUTORADIOBUTTON”样式,并且它们的父处理程序是hGrpButton。
如果这两个按钮没有分组(因此它们的父处理程序将是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);

2
群组框不会在功能上“分组”其中的控件。它仅用于视觉清晰度。要接收来自单选按钮的消息,您必须使用父hWnd作为它们的父窗口。 - ScottMcP-MVP
1个回答

21

在阅读了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放入第一个单选按钮的样式中。它将分组当前的单选按钮,直到看到第二个WS_GROUP,正如Coder_Dan所提到的。

修改我的先前代码:

a. 将hWnd用作所有4个单选按钮的父窗口

b. 在第一个和第三个按钮的样式中加入WS_GROUP,以便将1,2和3,4单选按钮进行分组

c. 现在,您可以转到WM_COMMAND,并根据其ID监听4个按钮的消息,在主窗口句柄hWnd下进行操作。

    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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接