MFC中如何判断一个窗口(CWnd)对象是否存在?

shineryu 2009-08-06 12:44:23
在标准的Win32程序中,可以通过IsWindow(hWnd)来判断窗口是否存在。
在MFC程序中,可以通过CWnd::GetSafeHwnd()来获取窗口句柄,理论上可以使用IsWindow(wnd.GetSafeHwnd())来判断wnd对象是否存在。但是如果wnd对象已经释放,那么就无法调用wnd.GetSafeHwnd()函数,也就不能用IsWindow(wnd.GetSafeHwnd())来判断窗口对象是否关闭!

请问,如何判断窗口(CWnd)对象是否存在?
...全文
868 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fish_gao 2009-08-06
  • 打赏
  • 举报
回复
wnd没有释放前保存窗口句柄
雪影 2009-08-06
  • 打赏
  • 举报
回复
IsWindow(wnd.GetSafeHwnd())就可以,wnd窗口资源释放了,一样可以使用的,只要窗口类对象还在就行。
xylicon 2009-08-06
  • 打赏
  • 举报
回复
想办法得到他的窗口句柄,有窗口句柄才能判断窗口是否存在。可以在wnd对象释放的时候保留窗口句柄。
shineryu 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tttyd 的回复:]
IsWindow(wnd.GetSafeHwnd())就可以,wnd窗口资源释放了,一样可以使用的,只要窗口类对象还在就行。
[/Quote]

您说的是正确的!

我的程序是其它地方出了问题——后台工作线程和主界面线程同步出了点问题,开始时怀疑wnd窗口资源释放导致GetSafeHwnd()函数无法调用。刚才做了一个只有主界面线程的小程序做了测试发现我的怀疑是错误的!

非常感谢!虽然并不是直接解决问题,但这个问题得到了澄清!
shineryu 2009-08-06
  • 打赏
  • 举报
回复
先感谢大家都热烈回复!
阜哥 2009-08-06
  • 打赏
  • 举报
回复
在CWnd的析构函数中会调用::DestroyWindow(m_hWnd)

所以,如果CWnd类的对象释放了,窗口句柄也就释放了。也就不用判断窗口是否存在,因为不存在了。
CWnd类提供了微软基础类库所有窗口类的基本功能。 CWnd对象与Windows的窗口不同,但是两者有紧密联系。CWnd对象是由CWnd的构造函数和析构函数创建或销毁的。另一方面,Windows的窗口是Windows的一种内部数据结构,它是由CWnd的Create成员函数创建的,而由CWnd的虚拟析构函数销毁。DestroyWindow函数销毁Windows的窗口,但是不销毁对象CWnd类和消息映射机制隐藏了WndProc函数。接收到的Windows通知消息通过消息映射被自动发送到适当的CWnd OnMessage成员函数。你可以在派生类重载OnMessage成员函数以处理成员的特定消息。 CWnd类同时还使你能够为应用程序创建Windows的子窗口。先从CWnd继承一个类,然后在派生类加入成员变量以保存与你的应用程序有关的数据。在派生类实现消息处理成员函数和消息映射,以指定当消息被发送到窗口时应该如何动作。 你可以经过两个步骤来创建一个窗口。首先,调用构造函数CWnd以创建一个CWnd对象,然后调用Create成员函数以创建子窗口并将它连接到CWnd对象。 当用户关闭你的子窗口时,应销毁CWnd对象,或者调用DestroyWindow成员函数以清除窗口并销毁它的数据结构。 在微软基础类库,从CWnd派生了许多其它类以提供特定的窗口类型。这些类有许多,包括CFrameWnd,CMDIFrameWnd,CMDIChildWnd,CView和CDialog,被用来进一步派生。从CWnd派生的控件类,如CButton,可以被直接使用,也可以被进一步派生出其它类来。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧