第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>;
… … …