本文介绍了C ++中的对话框没有收到某些按键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因为我(最后)学习用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对话框
FONT 8,Tahoma
{
PUSHBUTTON&发送,IDC_BUTTON_SEND,280,168,22,14 ,BS_DEFPUSHBUTTON
LTEXTHello,IDC_STATIC1,9,9,29,39,SS_LEFT | SS_NOPREFIX | SS_SUNKEN,WS_EX_TRANSPARENT
EDITTEXT IDC_MESSAGE,9,168,265,13,ES_AUTOHSCROLL
PUSHBUTTON工具,IDC_BUTTON_TOOLS,8,185,146,14
PUSHBUTTON退出,IDC_BUTTON_EXIT, 185,136,14
}

非常感谢任何帮助。特别是现在在圣诞节的第3天。

解决方案

解决方案是添加 WS_TABSTOP style对话框的每个子元素。



例如:

  PUSHBUTTON& Send,IDC_BUTTON_SEND,280,168,22,14,BS_DEFPUSHBUTTON | WS_TABSTOP 

确保每个控件都有 WS_VISIBLE | WS_CHILD 样式。
也不要忘记在窗口中添加 WS_EX_CONTROLPARENT 样式,并从对话窗口中删除 WS_GROUP 样式。



此外



检查对话框proc / p>

或者如果您使用窗口代替使用以下代码片段



提供Tabbing由对话管理器,而不是窗口管理器。因此,要获取标签处理,您需要在窗口的hwnd的消息循环中调用 IsDialogMessage

  / *运行消息循环。它将运行直到GetMessage()返回0 * / 
while(GetMessage(& message,NULL,0,0))
{
if(!IsDialogMessage(hwnd,& messages) )
{
/ *将虚拟键消息转换为字符消息* /
TranslateMessage(& messages);
/ *发送消息到WindowProcedure * /
DispatchMessage(& messages);
}
}

请了解有关WS_TABSTOP和WS_GROUP对话框项目属性。



此链接对您有帮助:


As I'm (finally) learning to code Windows apps in C++ I stumbled upon this: I have a dialog box which I create with CreateDialog() and I also have a default button. However, each time I press TAB or ENTER, nothing happens, nor does the control focus change, nor does the default button activate. Here's the resource for my dialog.

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
}

Any help is greatly appreciated. Especially now on the 3rd day of Christmas.

解决方案

The solution is to add WS_TABSTOP styles to every child element of the dialog box.

For ex.:

PUSHBUTTON      "&Send", IDC_BUTTON_SEND , 280, 168, 22, 14, BS_DEFPUSHBUTTON | WS_TABSTOP

Be sure that every control has WS_VISIBLE | WS_CHILD styles.Also do not forget to add WS_EX_CONTROLPARENT style to the window and remove WS_GROUP style from the dialog window.

Moreover

Check your dialog proc

Or if you use window proc instead use the following snippet

Tabbing is provided by the dialog manager, not the Window manager. Therefore, to get tab handling, you need to call IsDialogMessage in your message loop with the hwnd of your window:

/* 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);
    }
}

Please, learn about WS_TABSTOP and WS_GROUP dialog box items attributes.

This link should be helpful for you: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644994.aspx#controls

这篇关于C ++中的对话框没有收到某些按键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-31 14:15