如何设置多个单选按钮组以实现正确的Tab键顺序和键盘交互(WIN32)?

问题描述 投票:8回答:2

首先这不是MFC。这是我一直在处理的GUI的裁剪版本:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8wM3AzVC5qcGcifQ==” alt =“在此处输入图像描述”>

如您所见,我已经(尝试过)使用代码创建两个不同的组,即图标和按钮:

    index->hAddT.hwndIndex[2] = CreateWindowEx(NULL,L"BUTTON",L"Icon",WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
    200,135,120,170,WINDOWHANDLE,(HMENU)IDC_RADIOGROUP,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWL_HINSTANCE),NULL);

我有一个问题,您可能会看到,该窗口只有一个单选按钮。这意味着用户不可能从“图标”组中选择一个单选按钮,而从“按钮”组中选择一个单选按钮。我已经将每个单选按钮初始化为:

    index->hAddT.hwndIndex[3] = CreateWindowEx(NULL,L"BUTTON",L"Information",WS_CHILD | BS_AUTORADIOBUTTON | WS_VISIBLE,
    205,155,100,20,WINDOWHANDLE,(HMENU)IDC_RADIO1,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWL_HINSTANCE),NULL);       

我想以某种方式使单选按钮的“图标”组与单选按钮的“按钮”组分开,因此,每组将有一个单选按钮。这怎么可能,是否需要我创建一个新窗口和一个新的回调过程,才能有一个额外的单选按钮。必须有另一种方式将子项归为此类。

2 separate groups of radio buttons in the same form WINAPI (No MFC)该链接对我而言没有任何用处。

我旁边有Charles Petzold作参考的《 Windows Fifth Edition编程》,他在“组框”部分中指出“组框通常用于封装其他按钮控件,但没有真正的示例。

c++ winapi window radio-button win32gui
2个回答
15
投票

与流行观点相反,您不需要组框控件或任何其他此类外部“容器”(组框也不是,它只是按钮构件)。下面介绍如何根据组框的[[no要求执行此操作。如果要使用功能上有助于此处描述的布局的组框,请转到此答案的EDIT部分,在此我解释如何实现OP的特定需求。

自动单选按钮“存储库”通过使用两个键窗口样式属性

WS_GROUP

WS_TABSTOP来工作。对您的两个“银行”执行以下操作,我将它们分别称为Bank1和Bank2:
  1. Bank 1:第一个单选按钮应具有

    both WS_GROUP | WS_TABSTOP的控件样式。其余的单选按钮应该是其中的noth

,并且必须按同级顺序排列(这意味着在DIALOG脚本中它们会立即彼此跟随;在动态创建中,它们是按顺序创建的)。
  • Bank1中的最后一个单选按钮

    after您最后一个单选按钮应至少具有WS_GROUP样式和WS_GROUP | WS_TABSTOP(如果它是一个制表符停止的控件)。

  • Bank 2:第一个单选按钮应具有

    both

  • WS_GROUP | WS_TABSTOP的控件样式。其余的单选按钮应该是其中的noth
    ,并且必须按同级顺序排列(这意味着在DIALOG脚本中它们会立即彼此跟随;在动态创建中,它们是按顺序创建的)。
  • Bank2中的最后一个单选按钮

    after您最后一个单选按钮应至少具有WS_GROUP样式和WS_GROUP | WS_TABSTOP(如果它是一个制表符停止的控件)。

  • 如上所述的布局可让您“跳到”单选按钮库,并使用箭头键切换选择。然后,您再次“制表”以离开该银行,并转到下一个制表位。请记住,当您按下Tab键(或在Shift-Tab之前)时,对话框管理器将始终移至下一个WS_TABTOP子控件。如果要跳到的控件是自动类型,则所选控件将是最新WS_GROUP中的“选定”控件。

    如果有帮助,请抓住一个素描垫,将其画在纸上,并在制表位上贴上“ T”,并在组属性上贴上“ G”,如上所述。可视化后可能会更加清晰。查看对话框资源脚本,以了解它们如何协同工作以获取更多见解。

    注意:如果您想使用围绕它们的分组框,则可以。对话框管理器通过根据使用WS_GROUP标记的最后一个控件将控件与组相关联来进行工作,此后具有WS_TABSTOP的第一个控件被视为该组的跳入点。也可以使用先插入Groupbox(不能为Tabstop),然后插入具有第一个单选按钮的WS_TABSTOP的单选按钮控件(这次没有WS_GROUP)。通常,我发现不依赖组框就可以简单地排列单选按钮。

    编辑

    图片说出千言万语>为了您的图片,我可能会按以下顺序创建以下子级:

      “图标”组框,包括WS_GROUP样式。
    1. “信息”自动单选按钮,包括WS_TABSTOP
    2. [所有其他“图标”组单选按钮。不包括WS_TABSTOP或WS_GROUP。
    3. “ Button”组框,包括WS_GROUP样式。这将关闭当前的控制组并开始下一个。
    4. “ AbortretryIgnore”自动单选按钮,包括WS_TABSTOP
    5. [所有其他“按钮”组单选按钮。不包括WS_TABSTOP或WS_GROUP。
    6. “ Button”单选按钮后的下一个控件必须包含WS_GROUP。这将关闭当前的控制组并开始下一个。
    7. 显然,所有其他子控件样式,可见性等也需要正确使用,当然,所有子控件都应具有唯一的ID。我假设您已经涵盖了其余部分。

    0
    投票
    注意,这也适用于一组复选框,这是一个有效的用例。
    © www.soinside.com 2019 - 2024. All rights reserved.