【问题标题】:Default push button works just once默认按钮只工作一次
【发布时间】:2013-06-14 12:45:08
【问题描述】:

我有一个简单的对话框,带有一个列表框、编辑框和两个按钮,发送和清除,发送是默认设置。当按下它时,将从编辑框中读取字符串并将其添加到列表框中。清晰不言自明。当我第一次按 enter 时,一切正常,但是当我第二次按 enter 时,它没有响应/注册。如果单击按钮,一切都会按预期工作。

我在将焦点更改回编辑框后尝试使用 DM_SETDEFID,但没有任何效果。

去掉了不必要的代码,所以我希望没有遗漏任何东西。

INT_PTR CALLBACK CHAT(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDC_BUTTON1)
        {
                string strDisplay="You: "+strMessage;
                TCHAR szDisplay[MESSAGE_SIZE];
                strcpy_s(szDisplay, strDisplay.c_str());

                SendDlgItemMessage(hDlg, IDC_LIST1, LB_ADDSTRING, NULL, (LPARAM)&szDisplay);
                SetDlgItemText(hDlg, IDC_EDIT1, "");
            }
            SetFocus(GetDlgItem(hDlg, IDC_EDIT1));
        }
        else if(LOWORD(wParam) == IDC_BUTTON2)
        {
            SetDlgItemText(hDlg, IDC_EDIT1, "");
        }
        break;
    case WM_CLOSE:
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
    }
    return (INT_PTR)FALSE;
}

在资源文件中:

IDD_CHAT_DIALOG DIALOGEX 0, 0, 309, 176
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Chat"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    LTEXT           "Message:",IDC_STATIC,198,12,102,8
    EDITTEXT        IDC_EDIT1,198,24,102,108,ES_MULTILINE
    DEFPUSHBUTTON   "Send",IDC_BUTTON1,198,138,104,14
    PUSHBUTTON      "Clear",IDC_BUTTON2,198,156,104,14
    LISTBOX         IDC_LIST1,7,7,185,167,LBS_NODATA | LBS_NOSEL | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END

【问题讨论】:

  • 你能贴出代码吗?

标签: c++ winapi


【解决方案1】:

您有一个多行编辑控件。一旦获得焦点,它将处理所有按 ENTER 键的操作。

这是设计使然。如果按钮在编辑控件具有焦点时处理了 ENTER 键的按下,那么您如何在编辑控件中输入新行?

如果您确实需要阻止多行编辑控件占用 ENTER 键,那么您可以处理 WM_GETDLGCODE 来安排它。该技术在这里解释:http://blogs.msdn.com/b/oldnewthing/archive/2006/10/12/819674.aspx


顺便说一句,strcpy_s 是虚假的。在您的字符串上调用 c_str() 并将其直接传递给 API 函数。

【讨论】:

  • 我可以只使用 GetAsyncKeyState 还是应该重新设计它而不是寻找解决方法?
  • GetAsyncKeyState 不好。我添加到答案中以解释执行此操作的“正确”方法。我确实会问你是否确定要这样做。用户将如何在此编辑控件中输入换行符?还是只读的?
  • 用户将发送(短)消息,因此换行符并不重要,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2010-12-30
  • 2015-07-16
  • 1970-01-01
相关资源
最近更新 更多