对话框及其子控件的内部创建过程之详细分析
2014-07-15 10:27
204 查看
创建非模态对话框时,首先程序最先开始调用CreateDialogIndirectParam函数来创建对话框 ,
在CreateDialogIndirectParam中调用CreateWindowEx函数创建对话框主框架,
这时 CreateWindowEx函数发出WM_CREATEX消息,开始调用OnCreate函数。
注意这时所有对话框的子控件都还没创建 ,所以在OnCreate函数中对子控件所作的任何操作都会导致内存非法访问。
OnCreate函数成功返回后,创建主对话框的CreateWindowEx接着返回。 注意:这时才开始创建对话框子窗口控件。
接着根据对话框模板中子控件的信息,开始依次调用CreateWindowEx创建子控件,
比如这时,对话框模板中的子控件的位置和大小信息将作为CreateWindowEx函数的参数被传进函数, 子控件的默认位置,就在这时被确定下来了。
这里对话框模板中有几个子控件,CreateDialogIndirectParam就将调用几次CreateWindowEx函数。
等所有子控件创建完毕后,CreateDialogIndirectParam发出WM_INITDIALOG消息, 调用对话框的OnInitDialog的函数,
这时仍需注意: 否则极易出错,比如这时你将对话框基类的OnInitDialog函数注释掉, 那么这时你对子控件的操作将会失败,
因为在对话框基类的OnInitDialog函数中调用了UpdateData,UpdateData又调用了DoDataExchange,DoDataExchange又调用了DDX_Control,来子类化控件。
所以如果对话框基类的OnInitDialog函数没有得到调用,控件就无法完成子类化, (Toto我猜想你昨天说的控件句柄为NULL,估计是这种情况),
那么这时如果你通过控件的包装类来操作子控件比如MoveWindow移动子控件,
你会发现 控件句柄为NULL当然还有可能是你把对话框基类的OnInitDialog函数放在了后面来调用了,
在这个函数之前操作 子控件,那么也会出现控件句柄为NULL的现象。
最后OnInitDialog返回后,CreateDialogIndirectParam接着返回,就进入模态循环了~~ 完毕!
在CreateDialogIndirectParam中调用CreateWindowEx函数创建对话框主框架,
这时 CreateWindowEx函数发出WM_CREATEX消息,开始调用OnCreate函数。
注意这时所有对话框的子控件都还没创建 ,所以在OnCreate函数中对子控件所作的任何操作都会导致内存非法访问。
OnCreate函数成功返回后,创建主对话框的CreateWindowEx接着返回。 注意:这时才开始创建对话框子窗口控件。
接着根据对话框模板中子控件的信息,开始依次调用CreateWindowEx创建子控件,
比如这时,对话框模板中的子控件的位置和大小信息将作为CreateWindowEx函数的参数被传进函数, 子控件的默认位置,就在这时被确定下来了。
这里对话框模板中有几个子控件,CreateDialogIndirectParam就将调用几次CreateWindowEx函数。
等所有子控件创建完毕后,CreateDialogIndirectParam发出WM_INITDIALOG消息, 调用对话框的OnInitDialog的函数,
这时仍需注意: 否则极易出错,比如这时你将对话框基类的OnInitDialog函数注释掉, 那么这时你对子控件的操作将会失败,
因为在对话框基类的OnInitDialog函数中调用了UpdateData,UpdateData又调用了DoDataExchange,DoDataExchange又调用了DDX_Control,来子类化控件。
所以如果对话框基类的OnInitDialog函数没有得到调用,控件就无法完成子类化, (Toto我猜想你昨天说的控件句柄为NULL,估计是这种情况),
那么这时如果你通过控件的包装类来操作子控件比如MoveWindow移动子控件,
你会发现 控件句柄为NULL当然还有可能是你把对话框基类的OnInitDialog函数放在了后面来调用了,
在这个函数之前操作 子控件,那么也会出现控件句柄为NULL的现象。
最后OnInitDialog返回后,CreateDialogIndirectParam接着返回,就进入模态循环了~~ 完毕!
相关文章推荐
- 对话框及其子控件的内部创建过程之详细分析
- linux内核中socket的创建过程源码分析(详细分析)
- COM对象创建过程详细分析
- linux内核中socket的创建过程源码分析(详细分析)
- linux内核中socket的创建过程源码分析(详细分析)
- 使用 ASP+ DataGrid 控件来创建主视图/详细资料视图 (2)
- SQL Server联机丛书:存储过程及其创建
- 使用 ASP+ DataGrid 控件来创建主视图/详细资料视图
- SQL Server联机丛书:存储过程及其创建
- uClinux 启动过程详细分析
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- SQL Server联机丛书:存储过程及其创建
- 通过日志文件分析Peercast频道的创建过程
- 创建一个自定义WebControl控件 WebImageButton的过程
- Asp.net 2.0 自定义控件开发专题[详细探讨页面状态(视图状态和控件状态)机制及其使用场景](示例代码下载)
- Ping命令的幕后过程及其返回信息的分析
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- XmlEdit控件及其分析破解
- uClinux 启动过程详细分析(二)
- 存储过程及其创建