MFC的OnInit()函数中返回true和返回false之间的区别是什么

时间:2018-06-04 10:53:53

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

在基于Dialog的MFC应用程序的模板生成的源代码中,从InitInstance()派生的主应用程序的CWinApp初始化应用程序环境,然后创建作为主应用程序的对话框界面并使用DoModal()显示它。当显示的对话框返回时,应用程序结束并终止。

在从CDialogEx派生的主应用程序界面对话框中,有一个方法OnInitDialog(),它在初始化对话框时被调用。

从此方法返回TRUE或返回FALSE之间有什么区别?

BOOL CMyTabDlgs::OnInitDialog() 
{ 
    CDialog::OnInitDialog() ;
    // Some code
    return true;
}

BOOL CMyTabDlgs::OnInitDialog() 
{ 
    CDialog::OnInitDialog() ;
    // Some code
    return false;
}

1 个答案:

答案 0 :(得分:1)

MFC框架在处理OnInitDialog()消息时调用WM_INITDIALOG成员函数。

此成员函数的目的是提供一个位置,以执行对话框的控件和界面的任何特殊初始化。

OnInitDialog()方法中可以完成的事件之一是将焦点设置到对话框中的控件之一。此操作使程序员可以决定对话框中显示的哪个控件(按钮,编辑窗口,组合框等)应首先具有焦点。

或者程序员可以只允许MFC框架为他们做出决定。

如果程序员将焦点设置为特定控件,则OnInitDialog()方法应返回FALSE,以便MFC运行时知道焦点已经设置。

如果程序员未将焦点设置为特定控件,则OnInitDialog()方法应返回TRUE,以便MFC运行时知道它需要设置焦点。

这就是MFC模板创建的OnInitDialog()方法框架中的注释所表示的内容,如https://technet.microsoft.com/en-us/windows/fwz35s59(v=vs.60)的代码示例中所示

BOOL CSimpleDlg::OnInitDialog() 
{ 
   CDialog::OnInitDialog(); 

   // TODO: Add extra initialization here 
   m_cMyEdit.SetWindowText(_T("My Name")); // Initialize control values 
   m_cMyList.ShowWindow(SW_HIDE);      // Show or hide a control, etc. 

   return TRUE;  // return TRUE unless you set the focus to a control 
   // EXCEPTION: OCX Property Pages should return FALSE 
}

MSDN article CPropertySheet::OnInitDialog对返回值有更完整的解释:

  

指定应用程序是否已将输入焦点设置为以下一项   属性表中的控件。如果OnInitDialog返回非零,   Windows将输入焦点设置为属性中的第一个控件   片。仅当应用程序已明确设置了   将焦点输入到属性表中的控件之一。