【发布时间】:2012-03-29 05:17:17
【问题描述】:
Win32/C++。我有一个多行编辑控件和一个默认使用DM_SETDEFID 的按钮。当我将焦点放在编辑上按 Enter 键时,我希望焦点停留在那里而不是移动到按钮上。
【问题讨论】:
标签: winapi user-interface button focus editcontrol
Win32/C++。我有一个多行编辑控件和一个默认使用DM_SETDEFID 的按钮。当我将焦点放在编辑上按 Enter 键时,我希望焦点停留在那里而不是移动到按钮上。
【问题讨论】:
标签: winapi user-interface button focus editcontrol
编辑控件应该有ES_WANTRETURN style 以将行为更改为所需的:
指定当用户按 将文本输入到多行编辑控件中时的 ENTER 键 对话框。如果不指定此样式,请按 ENTER 键 与按下对话框的默认按钮具有相同的效果。 此样式对单行编辑控件没有影响。
要在创建控件后更改此样式,请使用 设置窗口长。
【讨论】:
ES_WANTRETURN风格了,不然早就被那个控件吃掉了吧?您通过它并让默认值转移焦点并触发按钮。现在您已调用BN_CLICKED 通知并处理它。这是您处理通知的机会,然后通过使用SetFocus 将焦点转移到您的编辑控件来完成它。
EN_KILLFOCUS 通知并记住单击按钮之前的最后一个通知。或者,您可以子类化按钮控件并处理其WM_SETFOCUS,以查看从哪个控件焦点传递到按钮。或者,可能还有其他有用的对话框消息,您可以使用 Spy++ 工具查看并加以利用。
DLGC_HASSETSEL | DLGC_WANTARROWS | DLGC_WANTCHARS | DLGC_WANTALLKEYS 以响应 WM_GETDLGCODE 消息。经过一些试验后,我发现将编辑子类化并返回 DLGC_HASSETSEL | DLGC_WANTARROWS | DLGC_WANTCHARS 反而会阻止按钮首先获得焦点。