窗口类、窗口类对象与窗口

来源http://blog.csdn.net/northhero/article/details/4514363

我们可以发现, SDK 程序中多了一个 HWND 类型的变量 hwnd 。该变量用来保存由 CreateWindowEx函数创建的窗口句柄,并将其作为参数传递给随后的显示窗口操作( ShowWindow 函数)和更新窗口操作(UpdateWindow 函数)。而我们自定义的实现代码中, CWnd 类定义了一个 HWND 类型的成员变量:m_hWnd ,用于保存这个窗口句柄。首先 CWnd 类的 CreateEx 函数创建窗口,并将该窗口句柄 保存到这个成员变量,接着调用 CWnd 类的 ShowWindow 函数显示窗口时,就不需要再传递这个句柄了,因为它已经是成员变量,该函数可以直接使用它。 CWnd 类的 UpdateWindow 函数也是一样的道理。

许多程序员在进行 MFC 程序开发时,容易混淆一点:认为这里的 CWnd 类型的 wnd 这个 C++ 对象所代表的就是一个窗口。因为在实践中,他们看到的现象是:当 C++ 窗口类对象销毁时,相应的窗口也就没了。有时正好巧合,当窗口销毁时, C++ 窗口类对象的生命周期也到了,从而也销毁了。正因为如此,许多程序员感觉 C++ 窗口类对象就是窗口,窗口就是这个 C++ 窗口类对象。事实并非如此。读者可以想像一下,如果我们关闭了一个窗口,这个窗口就销毁了,那么该窗口对应的 C++ 窗口类对象销毁了没有呢?当然没有。当一个窗口销毁时,它会调用 CWnd 类的 DestroyWindow 函数,该函数销毁窗口后,将 CWnd 成员变量:m_hWnd 设为 NULL 。

C++ 窗口类对象的生命周期和窗口的生命周期不是一致的。当一个窗口销毁时,与 C++ 窗口类对象没有关系,它们之间的纽带仅仅在于这个 C++ 窗口类内部的成员变量: m_hWnd ,该变量保存了与这个 C++ 窗口类对象相关的那个窗口的句柄。

另一方面,当我们设计的这个 C++ 窗口类对象销毁的时候,与之相关的窗口是应该销毁的,因为它们之间的纽带( m_hWnd )已经断了。另外,窗口也是一种资源,它也占据内存。这样,在 C++ 窗口类对象析构时,也需要回收相关的窗口资源,即销毁这个窗口。

因此,读者一定要注意:

C++ 窗口类对象与窗口并不是一回事,它们之间惟一的关系是 C++ 窗口类对象内部定义了一个窗口句柄变量,保存了与这个 C++ 窗口类对象相关的那个窗口的句柄。窗口销毁时,与之对应的 C++ 窗口类对象销毁与否,要看其生命周期是否结束。但 C++ 窗口类对象销毁时,与之相关的窗口也将销毁。

posted @ 2013-07-25 11:46  木有Some  阅读(582)  评论(0编辑  收藏  举报