首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何设置多个单选按钮组以获得正确的Tab键顺序和键盘交互(WIN32)?

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

Stack Overflow用户
提问于 2012-11-25 18:17:26
回答 2查看 8.8K关注 0票数 8

首先,这不是MFC。

以下是我一直在使用的GUI的裁剪版本:

正如您所看到的,我已经(尝试)使用以下代码创建了两个不同的组,Icon和Button:

代码语言:javascript
复制
    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);

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

代码语言:javascript
复制
    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在我旁边作为参考,他在分组框部分指出“分组框通常用于封装其他按钮控件”,但没有真正的例子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-25 18:33:31

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

自动单选按钮"banks“通过使用两个关键的窗口样式属性WS_GROUPWS_TABSTOP来工作。为您的两个“银行”(我将它们亲切地称为Bank1和Bank2)执行以下操作:

  1. Bank 1:第一个单选按钮在控件样式中应该同时具有WS_GROUP | WS_TABSTOP。其余的单选按钮不应该有任何样式,并且必须按兄弟顺序排列(这意味着在对话框脚本中,它们彼此紧跟在一起;在动态创建中,它们是在Bank1中最后一个单选按钮之后的第一个子控件中创建的,至少应该具有WS_GROUP样式,如果它是一个制表符停止的sequentially).
  2. The 2:第一个单选按钮应该在控件样式中同时具有WS_GROUP | WS_TABSTOP。其余的单选按钮都不应该有样式,并且必须按兄弟顺序排列(意思是在对话框脚本中,它们彼此紧跟在一起;在动态创建中,它们是在Bank2中最后一个单选按钮之后的第一个子控件中创建的,至少应该具有WS_GROUP样式,如果它是制表符停止的控件,则为WS_GROUP | WS_TABSTOP。

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

如果有帮助,抓起一个素描本,把它画在纸上,然后在制表位上贴上"T“,在组属性上贴上"G”,如上所述。一旦可视化,它可能会变得更加清晰。查看对话资源脚本,了解它们是如何协同工作的,从而获得更深入的见解。

注意:如果你想在它们周围使用组框,你可以。对话管理器的工作方式是基于标记为WS_GROUP的最后一个控件将控件关联到组,此后具有WS_TABSTOP的第一个控件被视为该组的跳转点。首先插入一个Groupbox (不能是can停止),然后在第一个单选按钮上插入带有WS_TABSTOP的单选按钮控件(这次没有WS_GROUP ),这也是可行的。我通常发现,不依赖于分组框而只是排列我的单选按钮会更容易。

EDIT一张图片能说出千言万语

对于您的图片,我可能会按以下顺序创建以下子项:

图标分组框,包括图标style.

  • "Information“自动单选按钮,包括WS_TABSTOP

  • All其他
  1. 组单选按钮。不包括WS_TABSTOP或WS_GROUP.
  2. "Button“分组框,包括WS_GROUP样式。这将关闭当前的控制组并启动next.
  3. "AbortretryIgnore“自动单选按钮,包括WS_TABSTOP
  4. All其他”按钮“组单选按钮。在“WS_GROUP.
  5. The”单选按钮必须包含WS_GROUP之后,不要包含WS_TABSTOP或Button next控件。这将关闭当前控制组并启动下一个控制组。

显然,所有其他的子控件样式、可见性等也需要正确使用,当然,子控件都应该有唯一的ids。我猜你已经把剩下的部分都介绍好了。

票数 15
EN

Stack Overflow用户

发布于 2020-04-15 19:13:10

注这也适用于一组复选框,这是一个有效的用例。

注意:如果第一个单选按钮可能被禁用(例如,由于运行时条件),您必须使第一个启用的单选按钮具有WS_TABSTOP样式。以下几行代码确保了这一点:

代码语言:javascript
复制
    // Set WS_TABSTOP to the group's first enabled item
    for (HWND hwnd = GetDlgItem(IDC_FIRSTITEM) /*the first*/; hwnd != NULL && !::IsWindowEnabled(hwnd); hwnd = ::GetWindow(hwnd, GW_HWNDNEXT))
    {
        if ((GetWindowLong(hwnd, GWL_STYLE) & WS_GROUP) != 0)
            hwnd = NULL;
    }
    if (hwnd != NULL)
        ModifyStyle(hwnd, 0, WS_TABSTOP, 0);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13550087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档