OnInitDialog()是消息处理函数,但是在类的消息映射表中不存在,那么它是如何被调用的呢?
虽然可以通过添加消息处理来添加OnInitDialog函数,但它并没有在实现文件中添加相应的消息映射,消息映射还是存在于基类中的(由HandInitDialog处理)。如果是真正的消息处理函数,它的声明前面应该有afx_msg,而OnInitDialog还是以虚函数声明的。
如果你把该声明移到消息处理函数声明区之外,它还是正常工作的,跟踪一下程序,过程还是:WM_INITDIALOG->HandInitDialog->Default->DefWindowPoc->AfxDlgProc->OnInitDialog。
所以OnInitDialog是虚函数,不是消息处理函数。
因为,派生类同样继承了基类的消息映射,所以上面的过程对派生类也有效。
上面的AfxDlgProc函数调用OnInitDialog函数时,虽然是调用基类的,但因为OnInitDialog是虚函数,当在派生类中重载了该函数后,实际上调用的是派生类的版本。
有时,我们需要在重载的虚函数或消息处理函数中再次显式的调用基类的同名函数,是为了将基类的函数功能也包括进来,如:
void CAboutDlg::OnInitDialog()
{
........................
CDialog::OnInitDialog ();
}
其中的.......................部分是派生类要实现的代码,为了也执行基类的缺省功能,也加上了对CDialog::OnInitDialog的调用。