如何在特定窗口中设置控件的初始焦点?

22

我创建了一个应用程序,其中使用窗口过程跟踪窗口中的所有控件。

我的问题是,如何最初将焦点设置到窗口中第一个创建的控件?

1个回答

50

在MFC中有两种设置特定控件的初始焦点的方法。

  1. 第一种,也是最简单的方法是利用控件的制表顺序。当您使用Visual Studio的资源编辑器布局对话框时,可以为每个控件分配制表索引。具有最低制表索引的控件将自动接收初始焦点。要设置控件的制表顺序,请从“格式”菜单中选择“制表顺序”,或按 Ctrl+D

  2. 第二种略微复杂的方法是重写表示对话框的类中的OnInitDialog函数。在该函数中,可以将输入焦点设置为任何您希望的控件,然后返回FALSE以指示您已显式地将输入焦点设置为对话框框中的其中一个控件。如果返回TRUE,框架会自动将焦点设置到默认位置,描述为对话框框中的第一个控件。要将焦点设置为特定控件,请调用GotoDlgCtrl方法并指定您的控件。例如:

  3. 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在他的博客在这里解释为什么这比想象的更加复杂,并且为什么首选GotoDlgCtrl函数(或其等效的WM_NEXTDLGCTRL消息)。


1
@Karthik:如果你是在窗口过程中实现它,那么你没有设置初始焦点。初始焦点是当你的对话框首次显示时具有焦点的控件。要设置它,你需要使用我描述的两种方法之一。此外,在使用MFC时,很少需要覆盖WndProc函数。你应该使用特定于你想要响应的消息的函数。但是,如果你坚持这样做,你仍然可以使用GotoDlgCtrl方法,就像我在答案的第二部分中演示的那样。 - Cody Gray
1
жҲ‘зҡ„й”ҷиҜҜеңЁдәҺжҲ‘еңЁGetDlgItem() CWndжҢҮй’ҲдёҠи°ғз”ЁдәҶSetFocus()пјҢиҖҢдёҚжҳҜGotoDlgCtrl()гҖӮ GotoDlgCtrl() иө·дҪңз”ЁдәҶпјҢдҪҶ SetFocus() жІЎжңүгҖӮ - franji1
2
对于任何想知道选项卡顺序如何存储在资源文件代码(*.rc)中的人来说,它似乎是由控件条目的顺序确定的。 - Herohtar
我发现有时在OnInitDialog()中调用GotoDlgCtrl不起作用,因为它太早了。但是,如果我设置一个500毫秒的定时器,在OnTimer()中调用GotoDlgCtrl(),然后杀死定时器,它就可以工作了。 - Michael Haephrati
从工作线程中调用 SetFocus() 没有起作用。但是 GetDlgItem() 起作用了! - Gsv
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接