注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

多多的爹

 
 
 

日志

 
 

如何实现wxDialog的OnInitDialog  

2009-03-20 21:17:16|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

貌似wxDialog没有OnInitDialog这样的函数。翻了一下源代码,有个Init(),可惜达不到OnInitDialog的功能。一来这个函数同样是在wxDialog的构造函数里被调用,二来这个函数不是虚函数。

OnInitDialog的本质是在对话框创建完成后,Windows的对话框窗口会接收到一个WM_INITDIALOG的消息。MFC为这个消息做了封装,提供了OnInitDialog函数。在这个函数中做了大量的对话框初始化的工作。做为CDialog的派生类,我们可以重载这个函数被加入自己的初始化代码。

说说没有OnInitDialog,在wxWidgets中会发生什么。在wxWidgets中,好像除了wxApp,就没有哪个封装类有初始化函数可以重载。一切的初始化都在类的构造函数中实现。特别是wxDialog,要在构造函数中创建窗口上所有的控件——并完成初始化。这就带来至少两个问题(我暂时只遇到两个)。一是所有的对话框数据都必需通过对话框的构造函数传递进来,这样才能及时初始化。另一个是当窗口显示后,会激发窗口激活事件,此时对话框会将焦点放在第一个被创建的控件上(不包括Label这样死控件)。由于焦点转移,前面的初始化工作可能就完全被错误了。比如说,一开始创建了一系列的wxRadioButton控件,并将第三个设置为选中。当对话框显示出来后,第一个wxRadioButton被选中了。因此第一个最先被创建。

因此对于这样的情况,只能找别的办法了。我研究了一下,对于模式对话框,可以重载ShowModal这个函数。这个函数在对话框显示前被调用,在这里做对话框初始化工作非常棒。对于非模式对话框,则可以自己加一个public函数InitDialog(),由创建者来调用。

  评论这张
 
阅读(67)| 评论(6)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017