2011-02-25 34 views

回答

30

有两种方法可以将初始焦点设置为MFC中的特定控件。

  1. 第一个,也是最简单的方法就是利用你的控件选项卡顺序的。当您使用Visual Studio中的资源编辑器布局对话框时,可以为每个控件分配一个选项卡索引。与最低选项卡索引的控件将自动收到初始焦点。要设置控件的Tab键顺序,请从“Format”菜单中选择“Tab Order”,或按Ctrl + D

  2. 第二种稍微复杂的方法是覆盖表示对话框的类中的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消息)是首选。

+0

其实我是问窗口过程中...... – karthik 2011-02-25 07:18:27

+1

@Karthik:如果你在窗口过程中,你没有设置初始焦点。初始焦点是首次显示对话框时焦点所在的控件。要设置它,您需要使用我描述的两种方法之一。此外,当你使用MFC时,很少需要重写'WndProc'函数。您应该针对您要回复的消息使用特定的功能。但是如果你坚持这样做,你仍然可以使用'GotoDlgCtrl'方法,正如我在答案的第二部分中所演示的那样。 – 2011-02-25 07:21:32

+1

我的错误是我在GetDlgItem()CWnd指针调用SetFocus(),而不是GotoDlgCtrl()。 GotoDlgCtrl()工作,但SetFocus()没有。 – franji1 2015-04-29 18:36:09

相关问题