【问题标题】:In a dialog, how can I stop a default pushbutton from taking focus when hitting enter in an edit control?在对话框中,如何在编辑控件中按回车键时阻止默认按钮获得焦点?
【发布时间】:2012-03-29 05:17:17
【问题描述】:

Win32/C++。我有一个多行编辑控件和一个默认使用DM_SETDEFID 的按钮。当我将焦点放在编辑上按 Enter 键时,我希望焦点停留在那里而不是移动到按钮上。

【问题讨论】:

    标签: winapi user-interface button focus editcontrol


    【解决方案1】:

    编辑控件应该有ES_WANTRETURN style 以将行为更改为所需的:

    指定当用户按 将文本输入到多行编辑控件中时的 ENTER 键 对话框。如果不指定此样式,请按 ENTER 键 与按下对话框的默认按钮具有相同的效果。 此样式对单行编辑控件没有影响。

    要在创建控件后更改此样式,请使用 设置窗口长。

    【讨论】:

    • 我应该更清楚。我确实希望回车键触发默认按钮,但我希​​望焦点留在编辑控件上(而不是插入换行符)。
    • 那你就不需要ES_WANTRETURN风格了,不然早就被那个控件吃掉了吧?您通过它并让默认值转移焦点并触发按钮。现在您已调用BN_CLICKED 通知并处理它。这是您处理通知的机会,然后通过使用SetFocus 将焦点转移到您的编辑控件来完成它。
    • 如果你有多个编辑控件并且你想将焦点返回到按钮之前的那个,事情会变得更加棘手。然后您可能想收听EN_KILLFOCUS 通知并记住单击按钮之前的最后一个通知。或者,您可以子类化按钮控件并处理其WM_SETFOCUS,以查看从哪个控件焦点传递到按钮。或者,可能还有其他有用的对话框消息,您可以使用 Spy++ 工具查看并加以利用。
    • 谢谢。 Spy++ 透露,该编辑正在返回 DLGC_HASSETSEL | DLGC_WANTARROWS | DLGC_WANTCHARS | DLGC_WANTALLKEYS 以响应 WM_GETDLGCODE 消息。经过一些试验后,我发现将编辑子类化并返回 DLGC_HASSETSEL | DLGC_WANTARROWS | DLGC_WANTCHARS 反而会阻止按钮首先获得焦点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多