在基于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;
}
答案 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将输入焦点设置为属性中的第一个控件 片。仅当应用程序已明确设置了 将焦点输入到属性表中的控件之一。