【问题标题】:Making TAB key work on Windows dialog使 TAB 键在 Windows 对话框上工作
【发布时间】:2010-09-28 11:46:03
【问题描述】:

我正在处理一个 Windows 项目,其中包含一个使用 CreateWindowEx() 创建的简单对话框,它包含多个加载有 CreateDialog() 的窗格,用于从资源文件加载布局。在子窗格上有许多控件,包括文本框和按钮,我想使用 TAB 来导航,但我得到的只是 Windows 'bing' 告诉我该键没有做任何事情。我的消息循环如下所示:

while( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
{
    if( !IsDialogMessage(0, &msg) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

并且每个控制窗口的样式中都设置了 WS_TABSTOP 以及设置了 WS_EX_CONTROLPARENT 的所有者窗格。

我还需要做什么才能使 tab 键起作用吗?

谢谢, J

【问题讨论】:

    标签: windows user-interface winapi


    【解决方案1】:

    试试这个:

    http://support.microsoft.com/kb/71450(如何使用一个 IsDialogMessage() 调用多个无模式对话框)

    您的窗格是无模式对话框,IsDialogMessage 负责处理 Tab 键。我希望这篇文章完全符合你的情况。

    【讨论】:

    • 我刚刚尝试了文章中的技术,不幸的是它没有产生任何影响。这是加载对话框资源的正确方法还是有更好的方法?
    【解决方案2】:

    WS_TABSTOP 风格 WS_TABSTOP 样式指定用户可以通过按 TAB 键或 SHIFT+TAB 键移动到的控件。

    当用户按下 TAB 或 SHIFT+TAB 时,系统首先判断这些键是否由当前具有输入焦点的控件处理。它向控件发送 WM_GETDLGCODE 消息,如果控件返回 DLGC_WANTTAB,则系统将密钥传递给控件。否则,系统使用 GetNextDlgTabItem 函数来定位下一个可见、未禁用且具有 WS_TABSTOP 样式的控件。搜索从当前具有输入焦点的控件开始,并按照创建控件的顺序进行,即在对话框模板中定义它们的顺序。当系统定位到具有所需特性的控件时,系统会将输入焦点移至该控件。

    如果搜索具有 WS_TABSTOP 样式的下一个控件遇到具有 WS_EX_CONTROLPARENT 样式的窗口,系统将递归搜索该窗口的子窗口。

    应用程序还可以使用 GetNextDlgTabItem 来定位具有 WS_TABSTOP 样式的控件。该函数在不移动输入焦点的情况下检索具有 WS_TABSTOP 样式的下一个或上一个控件的窗口句柄。

    来源:MSDN。

    【讨论】:

    • 感谢您的信息。实际上,我之前在 MSDN 中遇到过这个问题,这似乎表明我所做的事情是正确的。我的父窗格设置了 WS_EX_CONTROLPARENT 样式,我的文本框设置了 WS_TABSTOP 但仍然没有。
    【解决方案3】:
    if( !IsDialogMessage(0, &msg) )
    

    第一个参数不应为NULL,它必须是对话框的句柄。当然在这里很痛苦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 2015-04-15
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多