如何在特定窗口中设置控件的初始焦点?
答
有两种方法可以将初始焦点设置为MFC中的特定控件。
第一个,也是最简单的方法就是利用你的控件选项卡顺序的。当您使用Visual Studio中的资源编辑器布局对话框时,可以为每个控件分配一个选项卡索引。与最低选项卡索引的控件将自动收到初始焦点。要设置控件的Tab键顺序,请从“Format”菜单中选择“Tab Order”,或按Ctrl + D。
-
第二种稍微复杂的方法是覆盖表示对话框的类中的
OnInitDialog
function。在该功能中,您可以将输入焦点设置为您希望的任何控件,然后返回FALSE
以指示您已明确将输入焦点设置为对话框中的其中一个控件。如果返回TRUE
,框架会自动将焦点设置为默认位置,如上所述,作为对话框中的第一个控件。要将焦点设置为特定控件,请调用GotoDlgCtrl
method并指定您的控件。例如:BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); // Add your initialization code here // ... // Set the input focus to your control GotoDlgCtrl(GetDlgItem(IDC_EDIT)); // Return FALSE because you manually set the focus to a control return FALSE; }
注意,你应该不组焦点在对话框中通过简单地调用特定控制的
SetFocus
方法。 Raymond Chen explains here on his blog为什么它比这更复杂,为什么GotoDlgCtrl
函数(或其等价函数,WM_NEXTDLGCTRL
消息)是首选。
其实我是问窗口过程中...... – karthik 2011-02-25 07:18:27
@Karthik:如果你在窗口过程中,你没有设置初始焦点。初始焦点是首次显示对话框时焦点所在的控件。要设置它,您需要使用我描述的两种方法之一。此外,当你使用MFC时,很少需要重写'WndProc'函数。您应该针对您要回复的消息使用特定的功能。但是如果你坚持这样做,你仍然可以使用'GotoDlgCtrl'方法,正如我在答案的第二部分中所演示的那样。 – 2011-02-25 07:21:32
我的错误是我在GetDlgItem()CWnd指针调用SetFocus(),而不是GotoDlgCtrl()。 GotoDlgCtrl()工作,但SetFocus()没有。 – franji1 2015-04-29 18:36:09