WTL开发者指南介绍
WTL开发者指南介绍
第4章-WTL快速之旅
目标
该章的目标为
<!--[if !supportLists]-->? <!--[endif]-->介绍WTL中的模板(templates)和类(classes)
<!--[if !supportLists]-->? <!--[endif]-->列举WTL中没有包含的特性
<!--[if !supportLists]-->? <!--[endif]-->描述诸如WTL名称空间(namespace)、CRT和错误处理(error handling)
<!--[if !supportLists]-->? <!--[endif]-->列举WTL的宏(macros)
<!--[if !supportLists]-->? <!--[endif]-->看一下如何利用AUTOEXP.DAT来改进调试过程
<!--[if !supportLists]-->? <!--[endif]-->回顾CRT和WTL的使用
<!--[if !supportLists]-->? <!--[endif]-->比较MFC和WTL
<!--[if !supportLists]-->? <!--[endif]-->涵盖WTL的CString类
WTL的分发
WTL的分发包有三部分:include目录下的15个C++头文件,WTL AppWizard和sample工程,其中核心的部分在include目录,AppWizard是用来生成调用定义在头文件中的模板/类的工程的,sample工程是用来说明如何使用这些模板和类的。你可能会花费数小时的时间来搞清楚AppWizard生成的代码和哪些sample工程,但是你需要数周的时间来学习定义在那些头文件中的模板和类。
WTL提供了大量的专注于用户界面(user interface)开发的模板和类,它们可以和ATL,STL,VC++OLE DB Data templates等其他模板库一起使用,并不存在竞争者关系。所有这些类加起来可以被看作是MFC和VB的竞争者。
在大多数地方,WTL是低层Win32API之上很“薄”的一层封装,在少数领域(比如,scroll-bars,splitters,print preview)WTL也有实质性的新功能。
除了WTL AppWizard,没有其他的和DevStudio集成的WTL向导了,我们可以用ATL Windows Message Handler Wizard来添加handlers,但是它们并没有对WTL’s message crackers。
模板和类
WTL是C++模板和类的集合。除了若干几个类使用了继承(比如,CDC,CPaintDC,cWindowDC和CPrintDC)这个别的情况外,WTL的模板和类是相互独立的,并没有公共的“根”,所以没有所谓的“WTL继承层次图”,因为WTL本身就没有复杂的层次关系。在这一节中我们将对WTL所涉及的功能领域做一个概述,并列举出可用的模板和类。我们也将列出那些优雅地包含各自功能领域的头文件。
每一个WTL应用程序必须包含atlapp.h,它在内部又包含了atluser.h和atlgdi.h。其他的WTL头文件只有在用到它们所包含的功能时才是必需的。
Application Services(atlapp.h)
这些类提供了模块(exe或dll)的基本功能和消息循环(message loop)。它们也支持消息过滤(messagefiltering)和空闲处理(idle handling)。
class CAppModule : public CComModule
class CServerAppModule : public CAppModule
class CMessageLoop
class CMessageFilter
class CIdleHandler
标准控件(Standard Controls)和通用控件(Common Controls) (atlctrls.h)
WTL提供了WindowsOS中每一个标准控件和通用控件的包装模板。这些模板一般是和ATL的CWindow一起使用,所以WTL也为每个控件提供了相应的typedef。在程序中我们一般使用这些typedef出来的值而不是直接使用模板。这些控件的定义如下:
template <class TBase>class CStaticT;
typedefCStaticT<CWindow> CStatic;
下面是一个完整的列表:
CButtonT CButton CTrackBarCtrlT CTrackBarCtrl
CListBoxT CListBox CUpDownCtrlT CUpDownCtrl
CComboBoxT CComboBox CProgressBarCtrlT CProgressBarCtrl
CEditT CEdit CHotKeyCtrlT CHotKeyCtrl
CScrollBarT CScrollBar CAnimateCtrlT CAnimateCtrl
CToolTipCtrlT CToolTipCtrl CRichEditCtrlT CRichEditCtrl
CHeaderCtrlT CHeaderCtrl CReBarCtrlT CReBarCtrl
CListViewCtrlT CListViewCtrl CMonthCalendarCtrlT CMonthCalendarCtrl
CTreeViewCtrlT CTreeViewCtrl CDateTimePickerCtrlT CDateTimePickerCtrl
CToolBarCtrlT CToolBarCtrl CIPAddressCtrlT CIPAddressCtrl
CStatusBarCtrlT CStatusBarCtrl CPagerCtrlT CPagerCtrl
CTabCtrlT CTabCtrl
这些控件可以用Create方法来创建,但是更多情况下我们用ResourceView创建对话框资源和其中的控件,这时我们可以在代码中实例化一个这些控件模板然后调用Attach方法来挂接到这些控件上。所以为一个对话框中的list box添加字符串可能使用下面的方法:
CListBox m_ListBox;
. . .
m_ListBox.Attach(GetDlgItem(IDC_LIST_DEMO));
m_ListBox.AddString(TEXT("One"));
注意ATL已经支持ActiveXcontrol containment所以WTL就没有提供额外的支持。WTL中有一些额外的控件类/模板来提供额外的功能。WTL的CComboboxEx是Win32ComboBoxEx控件的包装,它为标准的combobox提供了Image List支持。在WTL中,CComboBoxExT是从CComboBoxT继承的,并根据需要添加了额外的功能:
template <class TBase> class CComboBoxExT
: public CComboBoxT< TBase >
typedef CComboBoxExT<CWindow> CComboBoxEx;
WTL支持“平面风格的滚动条(flat scroll-bars)”,在功能上它们和普通滚动条一样,但是在外观上,就像它们的名字,它们是平面风格的,没有突起的斜面边界。
template <class T> class CFlatScrollBarImpl
template <class TBase> class CFlatScrollBarT :public TBase,
public CFlatScrollBarImpl<CFlatScrollBarT< TBase> >
typedef CFlatScrollBarT<CWindow> CFlatScrollBar;
Treeview控件用来处理HTREEITEM(一个包含tree中各个节点的复杂结构的句柄)。为了简化对HTREEITEM的处理,WTL提供了CTreeItem类,它提供了置文本、图片、数据、状态信息和遍历树的方法。CTreeViewCtrlExT模板是基于CTreeViewCtrlT模板的
template <class TBase> class CTreeViewCtrlExT :
public CTreeViewCtrlT< TBase >
typedef CTreeViewCtrlExT<CWindow> CTreeViewCtrlEx;
class CTreeItem; // wrapper for HTREEITEM
CTreeViewCtrlExT提供了处理CTreeItem和原始HTREEITEM句柄的方法。比如CTreeViewCtrlT提供了插入item的方法:
HTREEITEM InsertItem(LPTV_INSERTSTRUCT lpInsertStruct);
而CtreeViewCtrlExT提供这个方法:
CTreeItem InsertItem(LPTV_INSERTSTRUCT lpInsertStruct);
Edit boxes和rich-editboxes必需处理一些通用的消息,比如ID_EDIT_COPY, ID_EDIT_CUT,ID_EDIT_PASTE和ID_EDIT_UNDO。有两个类可以用来自动处理这些消息。
template <class T> class CEditCommands;
template <class T> class CRichEditCommands
: public CEditCommands< T >
还有管理imagelist和toolinfo的工具类。
class CImageList;
class CToolInfo : public TOOLINFO
一个drag-listbox和一个普通的listbox很类似,但是提供了拖动item的功能。CDragListNotifyImpl提供了拖放过程中的消息处理。
template <class TBase> class CDragListBoxT
: public CListBoxT< TBase >
typedef CDragListBoxT<CWindow> CDragListBox;
template <class T> class CDragListNotifyImpl;
一些通用组件可以配置为custom draw来呈现自己的itmes。它们会发送NM_CUSTOMDRAW消息,下面这个WTL模板就可以为处理这个消息提供帮助:
template <class T> class CCustomDraw
Command Bars (atlctrlw.h)
以前我们在程序中用标准的菜单条来向终端用户提供命令,然后是工具条(toolbar),后来又有了最初随InternetExplorer一起发布的rebar控件,它为菜单和工具条提供了统一的“容器”。WTL支持一种叫做command bar的控件,但是和Word2000中的有区别。
在WTL中,一个commandbar是一个增强版的menu bar,tool bar仍然要使用。在WTL生成的程序中,command bar个tool bar被分别容纳在一个rebar控件的不同band中,band可以在rebar中移动。Command bar(和tool bar)在WTL中是不可“停靠(dockable)”的。
WTL的command bar显示菜单并在菜单的旁边显示对应的工具条图标,方便了终端用户。
WTL提供了用于command bar的类:
class CCommandBarCtrlBase : public CToolBarCtrl
template <class T, class TBase = CCommandBarCtrlBase,
class TWinTraits = CControlWinTraits>
class CCommandBarCtrlImpl
: public CWindowImpl< T, TBase, TWinTraits>
class CCommandBarCtrl
: public CCommandBarCtrlImpl<CCommandBarCtrl>
当使用WTL AppWizard的默认设置生成一个程序时,你的程序会自动使用command bar而无需你额外的动作。
高级控件(atlctrlx.h)
WTL支持更多的高级控件。
CBitmapButton提供了可以显示imagelist图片的pushbutton
template <class T, class TBase = CButton,
class TWinTraits = CControlWinTraits>
class CBitmapButtonImpl
: public CWindowImpl< T, TBase, TWinTraits>
class CBitmapButton : publicCBitmapButtonImpl<CBitmapButton>
CCkeckListLiew提供了一组checkboxes。
template <DWORD t_dwStyle, DWORD t_dwExStyle,
DWORD t_dwExListViewStyle> classCCheckListViewCtrlImplTraits;
typedef CCheckListViewCtrlImplTraits<WS_CHILD |WS_VISIBLE |
LVS_REPORT | LVS_SHOWSELALWAYS, WS_EX_CLIENTEDGE,
LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT>
CCheckListViewCtrlTraits;
template <class T, class TBase = CListViewCtrl,
class TWinTraits = CCheckListViewCtrlTraits>
class CCheckListViewCtrlImpl
: public CWindowImpl<T, TBase, TWinTraits>;
class CCheckListViewCtrl
: public CCheckListViewCtrlImpl<CCheckListViewCtrl>;
… … …