支持动态创建和静态超链接类—CHyperLink类改进
2010-10-12 22:13
309 查看
CHyperLink类是网上普遍流传的一个超链接类。但是该类在代码中通过Create方法动态创建时会报错。原因在于创建悬浮窗口,CToolTipCtrl类的对象Create时出错。该类继承自CStaitc类。关于动态创建报错的问题,可参见网上的一些资料,如《CHyperLink动态创建时存在问题》。
原来的代码在PreSubclassWindow中有以下代码
正是Create一句出现问题。网上给出的解决方法是将上述代码放到OnCreate方法中。这样动态创建时就没有问题了,但是通过模版静态创建时又会崩溃。原因是PreTranlateMessagte中m_ToolTip的RelayEvent挂掉了。虽然可以通过判断m_ToolTip句柄是否为NULL来避免程序崩溃,但ToolTip没有创建出来,还是有bug的。
今天在网上看了一些关于OnCreate PreSubclassWindow PreCreateWindow 等方法的介绍,豁然开朗。
原来通过模版静态创建时,在PreSubclassWindow方法中创建ToolTip是没有问题的,因为此时父窗口(CHyperLink对象窗口)已经创建;但是静态创建时因为没有调用Create方法,不会产生WM_CREATE消息,OnCreate 函数是不会被调用的。因此把创建ToolTip的代码放到OnCreate 函数中,用模板静态创建对象时,ToolTip是不会被创建的。
而如果放在PreSubclassWindow 中,动态创建时,可以理解为父窗口还未完全创建好,导致 m_ToolTip.Create(this); 一句挂掉了。
那么能不能修改成既支持动态创建又支持静态创建的呢?
查了一些资料,找到一个不太美观但比较实用的方法。就是为CHyperLink设置一个标识标量BOOL m_bDynamicCreate,默认FALSE.重载Create 和 CreateEx 函数,将m_bDynamicCreate位置TRUE. 将创建ToolTip的代码封装到一个函数中。
修改PreSubclassWindow,判断如果是动态创建就创建ToolTip;然后再在OnCreate中也创建一次,这样就保证同时支持静态和动态创建。
原来的代码在PreSubclassWindow中有以下代码
CRect rect; GetClientRect(rect); m_ToolTip.Create(this); m_ToolTip.AddTool(this, m_strURL, rect, TOOLTIP_ID);
正是Create一句出现问题。网上给出的解决方法是将上述代码放到OnCreate方法中。这样动态创建时就没有问题了,但是通过模版静态创建时又会崩溃。原因是PreTranlateMessagte中m_ToolTip的RelayEvent挂掉了。虽然可以通过判断m_ToolTip句柄是否为NULL来避免程序崩溃,但ToolTip没有创建出来,还是有bug的。
今天在网上看了一些关于OnCreate PreSubclassWindow PreCreateWindow 等方法的介绍,豁然开朗。
原来通过模版静态创建时,在PreSubclassWindow方法中创建ToolTip是没有问题的,因为此时父窗口(CHyperLink对象窗口)已经创建;但是静态创建时因为没有调用Create方法,不会产生WM_CREATE消息,OnCreate 函数是不会被调用的。因此把创建ToolTip的代码放到OnCreate 函数中,用模板静态创建对象时,ToolTip是不会被创建的。
而如果放在PreSubclassWindow 中,动态创建时,可以理解为父窗口还未完全创建好,导致 m_ToolTip.Create(this); 一句挂掉了。
那么能不能修改成既支持动态创建又支持静态创建的呢?
查了一些资料,找到一个不太美观但比较实用的方法。就是为CHyperLink设置一个标识标量BOOL m_bDynamicCreate,默认FALSE.重载Create 和 CreateEx 函数,将m_bDynamicCreate位置TRUE. 将创建ToolTip的代码封装到一个函数中。
修改PreSubclassWindow,判断如果是动态创建就创建ToolTip;然后再在OnCreate中也创建一次,这样就保证同时支持静态和动态创建。
相关文章推荐
- VC2010 单文档动态创建按钮和响应函数 (请CSDN改进博客支持截图)
- Android -- fragment, 动态创建,创建选项卡,静态创建,fragment之间的通信
- poj 3630 / hdu 1671 Phone List 【Trie字典树 动态创建&静态创建】
- Fragment的静态创建、动态创建
- 创建DLL文件 以及 动态加载和静态加载 以及两者之间的区别
- 让“动态创建”、“静态创建”、“动态内存分配”、“动态联编”真相大白
- IE8以下版本不支持动态创建的HTML5元素?
- 动态创建控件支持事件响应并可保存与读取
- Listview不支持加载输入类控件,动态创建控件去代替listview的示例demo
- *Delphi DLL的创建、静态及动态调用
- C++实现只能动态或者静态创建对象
- 对象的动态和静态构造创建的区别
- 几行代码接入启动页广告, 自带图片下载、缓存相关功能, 无任何第三方依赖 - 支持静态/动态、全屏/半屏广告、iPhone/iPad.
- 静态dll和动态dll(创建、区别、调用方式)
- js图片库二次改进(动态创建HTML元素)
- 对象的动态和静态构造创建的区别
- 分享:http-watcher更新,改进对动态web程序的支持
- 动态创建控件支持事件响应并可保存与读取
- 使用new创建动态结构和自动, 静态, 动态三种存储方式
- 动态,静态 编译支持加密的wxSqlite3 1.9.2