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

时间:2013-06-19 09:08:04

标签: 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);

1 个答案:

答案 0 :(得分:11)

在阅读了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。

  3. 对我之前代码的修改

    一个。使用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);