SetFocus 和 KillFocus

Posted

技术标签:

【中文标题】SetFocus 和 KillFocus【英文标题】:SetFocus and KillFocus 【发布时间】:2018-07-16 14:14:04 【问题描述】:

我的对话框中有一个CMFCTabCtrl,我的CMFCTabCTrl 有两个标签。

第一个标签有一个CComboBox,第二个标签也有一个CComboBox

在第一个选项卡的 ComboBox 中新添加的任何项目都将反映在第二个选项卡的 ComboBox 中。同样,在第二个选项卡的 ComboBox 中新添加的任何项目都将反映在第一个选项卡的 ComboBox 中。

为此,我将所有 ComboBox 项放在一个向量中,并且在每个对话框的 WM_SETFOCUS 事件中,我将项添加到 ComboBox。

当用户在 ComboBox 中键入内容但随后用户选择另一个控件或对话框/选项卡时,我也将该项目添加到 ComboBox。为此,我在父对话框 OnCommand 中跟踪 CBN_KILLFOCUS 并将项目添加到 ComboBox。

现在我的问题是,当用户在 ComboBox 中键入内容并单击第二个选项卡时,首先调用第二个选项卡的 SetFocus,然后仅调用带有 CBN_KILLFOCUS() 消息的 OnCommand。因此,第二个选项卡没有第一个选项卡新添加的项目,而第一个选项卡有该项目。

如何使 ComboBox 项目在显示之前对第二个选项卡可用。

【问题讨论】:

WM_KILLFOCUS is the wrong time to do field validation。不是相同的用例,但基本原则也适用于此。您只是在使用错误的消息来执行操作。但由于您是在询问您的解决方案(而不是您真正试图解决的问题),因此很难提出建议。 除了IInspectable的评论:阅读this 【参考方案1】:

如果我在 AFX_WM_CHANGING_ACTIVE_TAB 上做必要的操作(无论我在 killfocus 上做什么),我就能达到我的要求。

【讨论】:

以上是关于SetFocus 和 KillFocus的主要内容,如果未能解决你的问题,请参考以下文章

是否有内置的 MS Access VBA 事件来简化数据验证和 SetFocus

WM_SETFOCUS和WM_KILLFOCUSWM_GETDLGCODE

WM_SETFOCUS和WM_KILLFOCUSWM_GETDLGCODECM_ENTER

SetFocus 到父窗口,然后回到子窗口

QT:即使在 setfocus() 之后也无法用键盘控制我的 QGraphicsPixmapItem

ItemizedOverlay 的 setFocus(overlayItem) 不起作用