前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不建议复用窗口管理对象

不建议复用窗口管理对象

作者头像
gaigai
发布2019-08-29 16:09:39
8810
发布2019-08-29 16:09:39
举报
文章被收录于专栏:Windows开发Windows开发

界面开发涉及2个重要概念:窗口管理对象、窗口资源。

窗口资源是指在屏幕上显示,用户可看见、可操作的窗口。

窗口管理对象是应用程序通过调用它的接口可操作控制窗口资源的显示,比如MFC提供的CWindow、CDialog,开源界面库duilib提供的WindowImplBase。

有些业务会频繁显示某类窗口,比如进度条、设置窗口。这类业务的实现方式有2种:复用窗口管理对象、不复用窗口管理对象。

复用窗口管理对象,是指窗口资源不断创建销毁,但是窗口管理对象是同一个。比如进度条窗口类CProgressBarWindow,第一次显示时调用Create创建窗口,销毁时调用Destroy,第二次显示时又调用Create创建窗口,再销毁。虽然某个时刻只有一个窗口资源,但是这两次的窗口都是对应同一个CProgressBarWindow对象。

复用窗口管理对象会概率出现第二次创建的窗口无法正常的显示,因为窗口管理对象一般是派生于界面库提供的基类,基类维护一些与窗口资源相关的状态,这类状态有些是子类可以控制重置,有些是无法控制。第二次创建窗口前如果无法重置恢复这些状态,将会影响窗口的正常显示,看具体的界面库的实现。所以不建议复用窗口对象,除非使用单例模式。单例模式是指窗口管理对象只有一个,窗口资源也只有一个,当关闭窗口资源时只是隐藏窗口,不关闭。单例模式要注意当数据发生改变的时候,窗口内容也要相应的变化。

不复用窗口管理对象,是指窗口管理对象与窗口资源的生命周期一样,窗口资源销毁的时候窗口管理对象也释放,一般是在接收到窗口的WM_NCDESTROY后销毁窗口管理对象。不复用窗口管理对象要注意每一次窗口的创建销毁之间必须保证互相独立,典型的错误实现:定义一个窗口管理对象成员变量比如CProgressBarWindow* m_pProgressBar = nullptr,创建窗口的时候new一个对象,处理WM_NCDESTROY时将m_pProgressBar = nullptr,看起来很正确的实现,其实隐藏一个潜在的问题:如果在处理WM_NCDESTROY时又触发窗口创建,时序将变为m_pProgressBar赋值为新的窗口管理对象,然后被置为nullptr,最后运行崩溃。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Windows开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档