当我(最终)学习用C ++编写Windows应用程序时,我偶然发现:我有一个用CreateDialog()
创建的对话框,我也有一个默认按钮。但是,每次按TAB
或ENTER
时,都不会发生任何操作,控件焦点也不会更改,默认按钮也不会激活。这是我对话框的资源。
IDD_MAINWIND DIALOG 0, 0, 312, 205
STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_POPUP | WS_SYSMENU
EXSTYLE WS_EX_WINDOWEDGE
CAPTION "Dialog"
FONT 8, "Tahoma"
{
PUSHBUTTON "&Send", IDC_BUTTON_SEND , 280, 168, 22, 14, BS_DEFPUSHBUTTON
LTEXT "Hello", IDC_STATIC1, 9, 9, 296, 149, SS_LEFT | SS_NOPREFIX | SS_SUNKEN, WS_EX_TRANSPARENT
EDITTEXT IDC_MESSAGE, 9, 168, 265, 13, ES_AUTOHSCROLL
PUSHBUTTON "Tools", IDC_BUTTON_TOOLS, 8, 185, 146, 14
PUSHBUTTON "Exit", IDC_BUTTON_EXIT, 163, 185, 136, 14
}
非常感谢任何帮助。特别是现在圣诞节的第3天。
答案 0 :(得分:3)
解决方案是将WS_TABSTOP
样式添加到对话框的每个子元素中。
例如:
PUSHBUTTON "&Send", IDC_BUTTON_SEND , 280, 168, 22, 14, BS_DEFPUSHBUTTON | WS_TABSTOP
确保每个控件都有WS_VISIBLE | WS_CHILD
个样式。
另外,不要忘记在窗口中添加WS_EX_CONTROLPARENT
样式,并从对话框窗口中删除WS_GROUP
样式。
<强>此外强>
检查对话框proc
或者,如果您使用窗口过程,请使用以下代码段
Tabbing由对话管理器提供,而不是Window管理器。因此,要获取标签处理,您需要使用窗口的hwnd在消息循环中调用IsDialogMessage
:
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
if (!IsDialogMessage(hwnd, &messages))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
}
请了解WS_TABSTOP和WS_GROUP对话框项属性。
此链接应对您有所帮助:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644994.aspx#controls