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

时间:2013-03-13 08:25:45

标签: c++ visual-c++ mfc

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

简单来说就是设置和终止MFC向导按钮的焦点

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

克里斯托弗和mfc的好答案都解释了正在发生的事情的不同部分,并告诉你如何解决这一部分。剩下的部分是你说应用程序自动将焦点设置为“取消”按钮。您还可以使用“布局” - “选项卡顺序”在“对话框”编辑器中对此进行控制,以使编辑控件具有第一个焦点。 .SetFocus()和返回FALSE的技术对于在程序控制下设置焦点很有用。布局 - 选项卡顺序对于选择[TAB]键将通过复杂对话框上的控件移动焦点的顺序非常有用。

答案 2 :(得分:0)

CDialog的标准行为是它将Enter键指定为单击OK按钮并将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);    
}