如何杀死 MFC 向导按钮的焦点

Posted

技术标签:

【中文标题】如何杀死 MFC 向导按钮的焦点【英文标题】:How to kill focus of MFC Wizard buttons 【发布时间】:2013-03-13 08:25:44 【问题描述】:

我正在开发一个 MFC 向导基础应用程序。当应用程序加载时,它会自动聚焦到cancel 按钮。如果用户按下回车键,则应用程序意外退出。 然后我使用cedit.setFocus() 将焦点设置为出现在内部对话框中的文本框。但是当我使用键盘输入时,它会聚焦文本字段,但如果我按下回车键,仍然会聚焦到 cancel 按钮。

简单来说,无论如何设置和取消 MFC 向导按钮的焦点

已编辑:我添加了我的问题的图片以进行澄清。看看这个窗口。这里光标在“文本框 1”中,即使它聚焦取消向导按钮(像聚焦两个元素)。如果我输入一些文本,它会毫无问题地转到“文本框 1”。但是如果我点击进入按钮,表单退出,因为它专注于取消按钮。所以我需要删除这个取消按钮的默认焦点。但只需要关注“文本框 1”

【问题讨论】:

【参考方案1】:

如果将焦点设置到 OnInitDialog 内的控件,则必须将默认实现的返回值更改为 FALSE。否则,框架会自动将焦点设置到对话框的第一个控件。

【讨论】:

【参考方案2】:

Christopher 和 mfc 的出色回答分别解释了正在发生的事情的不同部分,并告诉您如何解决该部分。剩下的部分是您说应用程序自动将焦点设置为“取消”按钮。您还可以在对话框编辑器中使用 Layout - Tab Order 来控制它,以使编辑控件具有第一个焦点。 .SetFocus() 和返回 FALSE 的技术对于在程序控制下设置焦点很有用。布局 - 选项卡顺序对于选择 [TAB] 键将焦点移动到复杂对话框上的控件的顺序很有用。

【讨论】:

【参考方案3】:

CDialog 的标准行为是将Enter 键指定为单击确定按钮,将ESC 键指定为取消按钮,这些消息在MFC 框架内的默认处理程序中处理。如果您想要与此不同的行为,则必须覆盖 IDOK 和 IDCANCEL 点击消息处理程序。

但是,您对Enter 键的编辑框响应的问题本身就是一个完全不同的问题。这是因为默认的编辑框仅用于处理单行文本输入,不响应Enter 键码。

要启用多行输入的编辑框,您必须在对话框编辑器中设置编辑框的Multi-lineWant return 属性。

来自 OP 的第一条评论后的其他信息 -----------------

OK 按钮被突出显示,因为它被设置为对话框的默认响应按钮。删除对话框编辑器中此按钮属性中的Default Button。但是,这仅用于视觉显示,您可能必须删除此 OK 按钮才能使用。

要禁用Enter 键作为对话框退出,您必须添加一个绕过处理程序,如下所示:

// add a message routing macro entry in the message map
ON_BN_CLICKED(IDOK, OnFilterDefaultExitKey)

// add a function prototype in the AFX_MSG() declaration
afx_msg void OnFilterDefaultExitKey();

// add a handler in the class implementation file
 /* ==================================== */
void CTest1Dlg::OnFilterDefaultExitKey() 

    // default exit key handler, ignore everything.

但是,以这种方式添加代码也会使OK 键完全无用,根本不响应任何点击。因此,您必须手动添加一个Done 按钮来处理用户对已编辑数据的最终确定。

 /* ========================== */
void CTest1Dlg::OnButtonDone() 

    EndDialog(IDOK);    

【讨论】:

请考虑我的 eddied 问题以获得澄清。我认为你的第一段提到了我需要的东西。那么如何改变enter键的默认行为呢?

以上是关于如何杀死 MFC 向导按钮的焦点的主要内容,如果未能解决你的问题,请参考以下文章

MFC 对话框 位图按钮 失去焦点

如何杀死 MFC 线程

如何防止 CWnd 获得焦点?

mfc 如何添加光标

VS2017 MFC 类向导 - 如何像在 VS2015 中一样使用它

如何在 MFC 中获得焦点消息?