我偶然发现了MFC的一个奇怪问题。我有一个Dialog,我检查ON_EN_KILLFOCUS上的每个Edit字段是否有效。如果验证没有通过我设置焦点并显示错误消息。如果我只关闭对话框,这没关系。我的意思是如果我错误地输入字段并按下关闭按钮或X,则在其他处理事件之后首先调用ON_EN_KILLFOCUS,因为消息出现并且焦点返回到字段。所以我的问题是:有没有办法在ON_EN_KILLFOCUS中查找哪个事件将在它之后呢?如果是,那么我可以检查它的关闭事件然后关闭对话框,而不是将我的焦点返回到错误输入的编辑字段。任何帮助都会有这么多的帮助!
答案 0 :(得分:2)
一般情况下,您无法知道焦点更改事件后发生的事件。
但是,可以解决这个问题,你可以在激活验证逻辑时更改条件 - 在
时验证编辑控件通过检查焦点是否丢失到另一个控件,您要对用户说,“不要继续使用此组件 - 您尚未正确填写当前组件!”。
它比验证任何焦点更改更能捕获用户的意图。当用户单击“关闭”或系统X按钮或任何其他按钮时,它也不会运行验证。 当然,单击“确定”按钮时需要添加显式验证。
这不仅代码相当简单(检查新焦点窗口是对话框的子窗口并且是输入组件 - 您可以通过查看窗口的窗口类名称来确定它是输入组件。编辑为编辑框。)
这还处理用户因其他原因(例如系统消息框)或其他焦点抓取事件而转移焦点的情况。由于焦点没有转移到其他编辑控件之一,因此不会运行验证,并且焦点不会强制回到您的应用程序,这对某些人来说可能非常烦人!