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

use*_*299 4 c++ winapi

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

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);
Run Code Online (Sandbox Code Playgroud)

use*_*299 12

在阅读了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下的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);
Run Code Online (Sandbox Code Playgroud)