ATL的GUI程序设计(4)ATL的窗口类
2006-04-11 22:54:24 来源:WEB开发网第三章 ATL的窗口类
CWindowImpl、CWindow、CWinTraits,ATL窗口类的奥秘尽在此三者之中。在本章里,李马将为你详细解说它们的使用方法。另外,本章的内容也可以算是本书的核心部分——如果你要进行ATL的GUI程序设计的话,就必须将ATL的窗口类设计理念了然于心。
窗口的组成
把ATL的窗口类撇开不谈先。我在上一章中提到:窗口类并非任何一种OOP语言中的类——它所包括的并不是通称的属性和方法(在C++中称作成员变量和成员函数),而是属性和响应。现在是解释这句话的时候了。
所谓窗口的属性,无非是窗口的样式(style)、背景画刷(brush)、图标(icon)、光标(cursor)……等元素。你可以从WNDCLASS及WNDCLASSEX中找到它们。需要特别指出的是,窗口的样式事实上包括窗口类的样式和窗口实例的样式,窗口类的样式在注册窗口类之前经由WNDCLASS::style或WNDCLASSEX::style指定,而窗口实例的样式则是在创建窗口(CreateWindow/CreateWindowEx)的时候指定的。
对于窗口的响应,即是指窗口收到某消息后的处理。(在VB、Delphi等RAD环境中,处理窗口的响应亦称作窗口的事件处理。)对于SDK而言,为窗口提供响应也就是为窗口类提供一个回调函数,在回调函数中对我们感兴趣的窗口消息进行特殊处理,譬如上一章中针对WM_DESTROY和WM_PAINT的处理。
另外,我们在进行Win32程序设计的时候,往往还需要对窗口进行操作,譬如ShowWindow和UpdateWindow——姑且让我称之为“方法”。
属性、方法、事件,这回这哥仨算齐了。我们在对窗口进行C++封装时,需要考虑的也正是这三者。自然,依据OO的理念,我们可以很简单地将句柄作为成员变量,将方法作为成员函数,然后将事件经由某种特定的消息分流手段移交给各个成员函数进行响应处理,加之对不同种类的窗口使用继承进行区分——这就是MFC的封装做法。大家如果有兴趣的话,可以打开MFC的afxwin.h看一看CWnd类的代码。
更多精彩
赞助商链接