WTL开发者指南(3)

 

第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>;
 
… … …
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值