WINX 中的窗口类层次
要想使用winx进行Windows编程,了解一下winx的窗口类层次是非常必要的。Winx中的窗口类层次很简单,如下图所示:
从上图我们可以看出,winx中窗口类的类层次非常直观,WindowMessage是所有窗口类的基类,负责消息处理以及提供缺省的消息处理机制。从此类派生了两个类:DialogBase和Window。顾名思义,DialogBase类用于对话框处理,Window类用于窗口处理。ModalDialog和ModalessDialog派生自DialogBase,分别对应于模式对话框和无模式对话框。MainFrame、MDIMainFrame和MDIChildFrame派生自Window,其中MainFrame用于普通的窗口应用程序;MDIMainFrame和MDIChildFrame这两个类用于MDI应用程序(目前,在winx中还没有实现这个功能,winx的后续版本中会实现它)。
实际使用中,你只要从ModalDialog、ModalessDialog和MainFrame派生自己的类即可(MDI可用后,也可以从MDIMainFrame和MDIChildFrame派生),如下面的例子:
class CHelloMainFrame : public winx::MainFrame<CHelloMainFrame>
{
// 你的代码
……
}
具体的实现细节可以参照Winx教程。
在自定义控件时,可以从Window类直接派生。关于这方面的例子也可以参照Winx教程。
上面的类层次图中,在虚线方框中的参数表示的是模板参数,例如WindowMessage的原型如下:
template <class WindowClass>
class WindowMessage
{
}
另外,DialogBase和Window类名的右上角有一个名字HandleClass,这表示HandleClass也是DialogBase和Window类的基类。这里HandleClass也作为模板参数传进来,它的功能主要是封装一个窗口的基本操作(如设置窗口标题、维护窗口句柄等)。HandleClass有一个缺省值,大多数情况下你不需要指定它,请看Window类的原型:
template <class WindowClass, int nDlgId = 0, class HandleClass = DefaultWindowHandle>
class ModalDialog : public DialogBase<WindowClass, nDlgId, HandleClass>
{
}
而DefaultWindowHandle的定义如下:
typedef HandleT<::ATL::CWindow> DefaultWindowHandle;
这段定义说明HandleClass的实际类型是ATL中的CWindow类。关于CWindow类可以查看MSDN的帮助。