【问题标题】:win32 c++ detecting 'enter' in a edit control withot subclassing?win32 c++ 在没有子类化的编辑控件中检测“输入”?
【发布时间】:2011-06-02 14:54:17
【问题描述】:

基本上,我想要一个 Enter 来触发一条消息,当编辑控件获得焦点并且用户按下 Enter 时,我可以捕捉到消息。网上所有的解决方案似乎都是关于子类化的,但我想知道是否有另一种解决方法?

例如,我的按钮有一个标识符 ID_BUTTON_SEND。这是我的想象;

case WM_COMMAND:
     switch (LOWORD(wParam))
            case ID_BUTTON_SEND
                 if ('enter was pressed') 
                      do this
                 else
                      default

...你明白了 :) 我已经阅读了 http://support.microsoft.com/kb/102589,但坦率地说,选项 1 对我来说没有多大意义。

干杯

【问题讨论】:

    标签: c++ winapi button controls edit


    【解决方案1】:

    最好的方法是在调用 TranslateMessage 之前。因此,如果使用 MFC,请覆盖 CWnd::PreTranslateMessage。如果仅使用 Win API,则只需在调用 TranslateMessage 之前检查您的消息泵中包含的消息。

    【讨论】:

    • 我要查找什么消息? WM_CHAR、WM_KEYPRESS 什么的?另外 - 这是否会对性能产生影响,每次收到消息时都进行此检查?
    • 不要担心性能问题,它们可以忽略不计。但是,我忘记了要查找的消息:) 但由于它尚未被翻译,我认为 WM_KEYDOWN 将是要查找的消息。 (或 WM_KEYUP 也是)。
    【解决方案2】:

    您可以捕获焦点更改事件,当编辑控件获得焦点事件时,只需将对话框默认按钮更改为 *ID_BUTTON_SEND* 按钮。然后当焦点丢失时删除这个默认按钮标志。

    这意味着当编辑控件有焦点时,只要用户点击回车,对话框就会自动触发 *ID_BUTTON_SEND* 默认按钮。

    您可以通过将 BS_DEFPUSHBUTTON 添加到按钮的 GWL_STYLE 中,使该按钮成为默认按钮

    【讨论】:

      【解决方案3】:

      只是重申知识库文章。对于选项 1,您实际上可以简单地在 WM_COMMAND 中处理 IDOK。

      case WM_COMMAND:
        if(wParam == IDOK){
           ENTER WAS PRESSED
        }else{
          REGULAR EVENT HANDLING
        }
      

      这是检查 Enter 的一种更简单、更简洁的方法。

      【讨论】:

      • 谢谢!几天来一直试图追踪它。对于 OP,您可以检查控件的 HWND,因为它在您的 lparam 中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 2011-12-06
      • 2011-03-27
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多