使TAB键在Windows对话框上工作

时间:2010-09-28 11:46:03

标签: windows user-interface winapi

我正在开发一个带有CreateWindowEx()创建的简单对话框的Windows项目,它包含多个加载了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键工作吗?

谢谢, Ĵ

3 个答案:

答案 0 :(得分:3)

试试这个:

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

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

答案 1 :(得分: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。

答案 2 :(得分:1)

if( !IsDialogMessage(0, &msg) )

第一个参数不应该是NULL,它必须是对话框的句柄。当然痛苦不堪。