【问题标题】:How to Set the Initial Focus of the control in the particular window?如何在特定窗口中设置控件的初始焦点?
【发布时间】:2011-07-04 02:57:00
【问题描述】:

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

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

【问题讨论】:

    标签: c++ windows winapi mfc setfocus


    【解决方案1】:

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

    1. 第一种也是最简单的方法是利用控件的 Tab 键顺序。当您使用 Visual Studio 中的资源编辑器来布置对话框时,您可以为每个控件分配一个选项卡索引。 最低标签索引的控件将自动获得初始焦点。要设置控件的 Tab 键顺序,请从“格式”菜单中选择“Tab 键顺序”,或按 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 消息)。

    【讨论】:

    • @Karthik:如果您在窗口过程中执行此操作,则您没有设置初始焦点。初始焦点是第一次显示对话框时具有焦点的控件。要设置它,您需要使用我描述的两种方法之一。此外,当您使用 MFC 时,很少需要覆盖 WndProc 函数。您应该对要回复的消息使用特定的功能。但是,如果您坚持这样做,您仍然可以使用GotoDlgCtrl 方法,正如我在答案的第二部分中演示的那样。
    • 我的错误在于我在 GetDlgItem() CWnd 指针上调用了 SetFocus(),而不是 GotoDlgCtrl()。 GotoDlgCtrl() 有效,但 SetFocus() 无效。
    • 对于任何想知道标签顺序如何存储在资源文件代码 (*.rc) 中的人来说,它似乎是由控件条目的顺序决定的。
    • 是的,没错,@Herohtar。默认的 Tab 顺序等同于 Z 顺序。
    • 我发现有时候,从 OnInitDialog() 调用 GotoDlgCtrl 不会起作用,因为它太早了。但是,如果我将计时器设置为 500 毫升,并从 OnTimer() 调用 GotoDlgCtrl(),然后终止计时器,它就可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多