MFC的OnInit()函数中的return true和return false有啥区别

Posted

技术标签:

【中文标题】MFC的OnInit()函数中的return true和return false有啥区别【英文标题】:What's the difference between return true and return false in OnInit() function of MFCMFC的OnInit()函数中的return true和return false有什么区别 【发布时间】:2018-06-04 10:53:52 【问题描述】:

在基于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;

【问题讨论】:

technet.microsoft.com/en-us/windows/fwz35s59(v=vs.60) the documentation 告诉你什么? 【参考方案1】:

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

这个成员函数的目的是提供一个地方来执行对话框的控件和界面的任何特殊初始化。

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

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

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

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

这就是由 MFC 模板创建的 OnInitDialog() 方法框架中的 cmets 在 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 将输入焦点设置为属性中的第一个控件 床单。应用程序只有在明确设置了 将焦点输入到属性表中的某个控件。

【讨论】:

以上是关于MFC的OnInit()函数中的return true和return false有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

了解angularjs中的生命周期钩子函数$onInit,$onChange,$onDestory,$postLink

Angular2指令,构造函数与onInit [重复]

怎么初始化MFC主对话框界面

MFC中ProcessMessage()函数有啥作用?

Mfc获取函数地址..T T 要求: 用DWORD 变量获取RtlEnterCriticalSection函数地址...并将

在 MFC 应用程序中动态创建控件