c++ - 如何设置多个单选按钮组以获得正确的 Tab 键顺序和键盘交互 (WIN32)?

标签 c++ winapi window radio-button win32gui

首先,这不是 MFC。
这是我一直在研究的 GUI 的裁剪版本:

enter image description here

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

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

我遇到的问题以及您可能会看到的问题是窗口只有一个单选按钮。这意味着用户不可能从 Icon 组中选择一个单选按钮,从 Button 组中选择一个。我已经初始化了每个单选按钮:
    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)
该链接对我的目的没有任何用处。

我有 Windows 第五版的编程作为引用,由 Charles Petzold 在我身边作为引用,他在 Group Boxes 部分指出“Group Boxes 通常用于包含其他按钮控件”,但没有真实的例子。

最佳答案

与流行观点相反,您不需要 groupbox 控件或任何其他此类外部“容器”(无论如何 groupbox 都不是,它只是一个按钮工件)。下面描述了如何使用 来做到这一点。否 组框的要求。如果您想要一个在功能上有助于此处描述的布局的组框,请转到 编辑 这个答案的一部分,我解释了如何实现 OP 的特定愿望。

自动单选按钮“银行”通过使用两个关键的窗口样式属性来工作, WS_GROUP , 和 WS_TABSTOP .对我亲切地称为 Bank1 和 Bank2 的两个“银行”执行以下操作:

  • 银行 1:第一个单选按钮应该有两个 WS_GROUP |控件样式中的 WS_TABSTOP。其余的单选按钮应该有 都不是 其中,并且必须按同级顺序(这意味着在 DIALOG 脚本中它们立即相互跟随;在动态创建中它们是顺序创建的)。
  • Bank1 中最后一个单选按钮之后的第一个子控件应该至少具有 WS_GROUP 样式,并且 WS_GROUP | WS_TABSTOP 如果它是制表符停止控件。
  • Bank 2:第一个单选按钮应该有两个WS_GROUP |控件样式中的 WS_TABSTOP。其余的单选按钮应该有 都不是 其中,并且必须按同级顺序(这意味着在 DIALOG 脚本中它们立即相互跟随;在动态创建中它们是顺序创建的)。
  • Bank2 中最后一个单选按钮之后的第一个子控件应该至少具有 WS_GROUP 样式,并且 WS_GROUP | WS_TABSTOP 如果它是制表符停止控件。

  • 像上面这样的布局允许你“tab”到一个单选按钮组,并使用箭头键来切换选择。然后您再次“tab”离开该银行并前往下一个tab-stop。请记住,当您点击 Tab(或使用 Shift-Tab 之前)时,对话框管理器将始终移动到下一个 WS_TABTOP 子控件。如果跳转到的控件是自动类型,则所选控件将是最近 WS_GROUP 中的“所选”控件。

    如果有帮助,请抓起草图,将其绘制在纸上,然后在制表位上贴上“T”,在组属性上贴上“G”,如上所述。一旦可视化,它可能会更清晰。查看对话资源脚本以了解它们如何协同工作以获得更多见解。

    注意:如果你想使用围绕这些的分组框,你可以。对话框管理器的工作原理是根据最后一个用 WS_GROUP 标记的控件将控件与组相关联,此后具有 WS_TABSTOP 的第一个控件被视为该组的选项卡跳转点。首先插入一个 Groupbox(不能是制表位),然后在第一个单选按钮(这次没有 WS_GROUP)上插入带有 WS_TABSTOP 的单选按钮控件,也将起作用。我通常发现在不依赖分组框的情况下排列单选按钮更容易。

    编辑 一张图说千言万语

    对于您的照片,我可能会按以下顺序创建以下子项:
  • “图标”分组框,包括 WS_GROUP 样式。
  • “信息”自动单选按钮,包括WS_TABSTOP
  • 所有其他“图标”组单选按钮。不要包含 WS_TABSTOP 或 WS_GROUP。
  • “按钮”分组框,包括 WS_GROUP 样式。这将关闭当前控制组并开始下一个。
  • “AbortretryIgnore”自动单选按钮,包括 WS_TABSTOP
  • 所有其他“按钮”组单选按钮。不要包含 WS_TABSTOP 或 WS_GROUP。
  • “Button”单选按钮之后的下一个控件必须包含 WS_GROUP。这将关闭当前的控制组并开始下一个。

  • 显然所有其他子控件样式、可见性等也需要正确使用,当然子控件都应该有唯一的 id。我假设您已经涵盖了其余部分。

    关于c++ - 如何设置多个单选按钮组以获得正确的 Tab 键顺序和键盘交互 (WIN32)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13550087/

    相关文章:

    c++ - 将表示二维数组的指针传递给 C++ 中的函数

    c++ - 在字符串中查找所有需要的单词

    c++ - 3D 迷宫 OpenGL 实现

    c# - 如何在 C# 中使用低级键盘钩子(Hook)来抑制任务切换键(winkey、alt-tab、alt-esc、ctrl-esc)

    javascript - 我需要为 Javascript 编写 window.onload=function() 才能工作

    游戏中的 C++ 段错误

    c - 如何使 winapi 中的文件不可执行?

    c - 即使 HWND 已验证,UpdateWindow() 也会发送 WM_PAINT 消息吗?

    javascript - setInterval/setTimeout 可能会导致页面重新加载

    c# - 设置对话框窗口的所有者时出现异常