Window不是基于DialogBox的,因此WS_TABSTOP不起作用。此外,我不希望Tab通过所有控件,我只想通过几个编辑控件Tab。
我做的是我超级编辑控件并处理WM_KEYDOWN消息,在编辑控件之间切换,通过获取行中的下一个窗口thorugh :: GetWindow(hwnd,GW_HWNDNEXT);另外,当我到达最后一个时,我想将焦点切换回第一个Edit控件。
当我到达最后一个Edit控件时,Code不起作用,:: GetWindow只返回行(?)中的下一个窗口,该窗口恰好是非超级编辑控件。还有更多隐藏的子窗口(SW_HIDE)。
也许如果我知道如何知道窗口的HWND的类名?
注意:Pure Win32 api,c ++ oop。
else if ( ( int ) wParam == VK_TAB )
{
HWND nextInLine;
nextInLine = ::GetWindow ( hwnd, GW_HWNDNEXT );
if ( hwnd == NULL ) nextInLine = ::GetWindow ( hwnd, GW_HWNDPREV );
::SendMessage ( nextInLine, EM_SETSEL, ( WPARAM ) 0, ( LPARAM ) -1 );
::SetFocus ( nextInLine );
return 0;
}
答案 0 :(得分:3)
您可以使用IsDialogMessage
API调用在任何窗口中免费获得键盘导航。要使用该服务,必须修改窗口消息循环以包含对IsDialogMessage
的调用,并且只有在对话管理器尚未处理的情况下才将消息传递给常规消息处理。
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
if (IsDialogMessage(hwnd, &msg)) {
/* Already handled by dialog manager */
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
不要忘记在父窗口上设置WS_EX_CONTROLPARENT
extended window style,以便对话管理器递归到子窗口。
答案 1 :(得分:1)
只有calling IsDialogMessage
可以逃脱,但结果不是100%对话。使普通窗口的行为类似于对话框:
DLGWINDOWEXTRA
作为WNDCLASS
的cbWndExtra
字段(不要忘记添加您可能已经使用的额外空间并抵消数据的索引)DefDlgProc
而非DefWindowProc
由于这会使您的窗口成为对话框,因此在调用DWLP_USER
或{{3}时,您需要使用GWLP_USERDATA
窗口而不是GetWindowLongPtr
,如果您正在使用该窗口}。
(从内存来看,上面做的主要是支持SetWindowLongPtr
,我发现使用Enter键来支持更改焦点,使用{{3中描述的方法I }}。)
然后在消息泵中,为消息泵中的每个类似对话框的窗口调用WM_NEXTDLGCTL
。
最后,在为类似对话框的窗口创建控件时,为要参与选项卡的每个窗口设置http://support.microsoft.com/kb/102589窗口样式,并设置IsDialogMessage
窗口exstyle(aka {{1在资源编辑器中)包含对话框控件的子窗口。