| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 12359 人关注过本帖
标题:OnInitDialog()是如何被调用的?
只看楼主 加入收藏
jpg4151
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2006-3-12
收藏
 问题点数:0 回复次数:11 
OnInitDialog()是如何被调用的?

OnInitDialog()是消息处理函数,但是在类的消息映射表中不存在,那么它是如何被调用的呢?

搜索更多相关主题的帖子: OnInitDialog 
2006-04-09 15:17
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
在你的Dialog第一次被调用(Initialize)的时候调用的。

http://myajax95./
2006-04-10 00:33
bfgghy
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2006-3-25
收藏
得分:0 
CDialog的消息映射中有ON_MESSAGE(WM_INITDIALOG, HandleInitDialog),由WM_INITDIALOG消息触发HandleInitDialog函数,在HandleInitDialog函数中调用CWnd的Default函数,Default函数又调用DefWindowProc函数,DefWindowProc再调用回调函数AfxDlgProc,在其中调用了CDialog的OnInitDialog函数。
另外,OnInitDialog不是消息处理函数,而是虚函数。
2006-04-10 17:34
jpg4151
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2006-3-12
收藏
得分:0 
OnInitDialog()应该是消息处理函数, 若不是的话为何会在声明部分出现如下语句
//{{AFX_MSG(...)
virtual BOOL OnInitDialog();

......

//}}AFX_MSG
2006-04-10 19:10
bfgghy
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2006-3-25
收藏
得分:0 
以下是引用jpg4151在2006-4-10 19:10:00的发言:
OnInitDialog()应该是消息处理函数, 若不是的话为何会在声明部分出现如下语句
//{{AFX_MSG(...)
virtual BOOL OnInitDialog();

......

//}}AFX_MSG

虽然可以通过添加消息处理来添加OnInitDialog函数,但它并没有在实现文件中添加相应的消息映射,消息映射还是存在于基类中的(由HandInitDialog处理)。如果是真正的消息处理函数,它的声明前面应该有afx_msg,而OnInitDialog还是以虚函数声明的。
如果你把该声明移到消息处理函数声明区之外,它还是正常工作的,跟踪一下程序,过程还是:WM_INITDIALOG->HandInitDialog->Default->DefWindowPoc->AfxDlgProc->OnInitDialog。
所以OnInitDialog是虚函数,不是消息处理函数。

2006-04-11 09:40
jpg4151
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2006-3-12
收藏
得分:0 
也就是说最终调用的是CDialog的OnInitDialog函数。那派生类的OnInitDialog函数是如何调用的呢?
2006-04-11 19:15
bfgghy
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2006-3-25
收藏
得分:0 
以下是引用jpg4151在2006-4-11 19:15:00的发言:
也就是说最终调用的是CDialog的OnInitDialog函数。那派生类的OnInitDialog函数是如何调用的呢?

因为,派生类同样继承了基类的消息映射,所以上面的过程对派生类也有效。
上面的AfxDlgProc函数调用OnInitDialog函数时,虽然是调用基类的,但因为OnInitDialog是虚函数,当在派生类中重载了该函数后,实际上调用的是派生类的版本。
有时,我们需要在重载的虚函数或消息处理函数中再次显式的调用基类的同名函数,是为了将基类的函数功能也包括进来,如:
void CAboutDlg::OnInitDialog()
{
........................

CDialog::OnInitDialog ();
}
其中的.......................部分是派生类要实现的代码,为了也执行基类的缺省功能,也加上了对CDialog::OnInitDialog的调用。

2006-04-11 21:51
jpg4151
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2006-3-12
收藏
得分:0 
可是把基类CDialog   OnInitDialog函数声明前面的virtual去掉后 派生类的OnInitDialog函数仍然可执行
2006-04-12 19:57
bfgghy
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2006-3-25
收藏
得分:0 
以下是引用jpg4151在2006-4-12 19:57:00的发言:
可是把基类CDialog OnInitDialog函数声明前面的virtual去掉后 派生类的OnInitDialog函数仍然可执行

你是怎么去掉的?是不是修改MFC源代码(afxwin.h中的第2613行)?如果修改了又怎么能重新编译MFC的源代码生成新的链接库呢?

2006-04-13 11:40
jpg4151
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2006-3-12
收藏
得分:0 

是的我把afxwin.h中的第2613行修改之后, 运行情况和修改前一样

2006-04-13 19:43
快速回复:OnInitDialog()是如何被调用的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037861 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved