初识 WTL( 上 )
作者: orange
1 .前言
虽然 MFC 的功能很强大,但 Windows Template Library(WTL) 的出现,无疑说明了 MFC 有一定的弊病。和 MFC 相比,功能并没有 MFC 完善。比如 MFC 支持 doc/view 架构,而 WTL 并 不支持。同时, WTL 也没有 Microsoft 的官方支持。但是, WTL 是基于模版 (template) 的,其应用程序最小只有 24KB ,同时不象 MFC ,依赖 DLL 。但是 WTL 也实现了 CString 、 CRect 、 CSize 、 CPoint 等常用的类,还 CStaticT<TBase> 、 CButtonT<TBase> 、 CListBoxT<TBase> 、 CComboBoxT<TBase>( 这些在 WTL 库文件 atlctrls.h 、 atlctrlw.h 、 atlctrlx.h 中就能看到 ) 等 用起来和 MFC 版本也没太大不同。
2 .准备工作
首先安装 WTL AppWizard, 现在最高版本应该是 WTL7.0, 直接运行 setup 脚本文件就可以了 , 这里给大家几个下载地址 :
1) http://www.vckbase.com/tools/listtools.asp?tclsid=111
3) http://www.copathway.com/vchelp/zsrc/wtlm.asp?type_id=70&class_id=1&cata_id=3&article_id=374
这样当你启动 VC6.0 后, File/New 时,在 Project 属性页就能看到添加了一项 ATL/WTL AppWizard 。你可以直接把 WTL 的库文件 ( 共 16 个 .h 文件 ) 拷贝到 vc 的安装目录 VC98/Include 中,也可以放到你的工程文件夹中。
3 .应用实例 1---SDI 中状态栏的应用
(1) File/New, 如图:
<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" alt="" style='width:431.25pt;height:317.25pt'> <v:imagedata src="file:///C:\DOCUME~1\JACKY_~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif" o:href="http://www.vckbase.com/document/journal/vckbase22/images/TestWTL2.gif"/> </v:shape><![endif]--><!--[if !vml]--> <!--[endif]-->
(2) OK 后,
SDI(Single Document Interface) 应用程序通常只有一个主窗口 ( 通常是一个框架窗口, Frame Window) 。框架窗口包含菜单、工具栏、状态栏和称为视 (View) 的客户工作区。
Multip-SDI(Multiple Threads SDI) ,就像 IE 浏览器,使用 " 文件 / 新建 / 窗口 " 命令后,会出现另一个 IE 窗口。
MDI(Multiple Document Interface) 应用程序有一个主框架窗口,但有多个子框架窗口。每个子窗口都有自己的视 (View), 和 MFC 的相似。
Dialog 应用程序是基于对话框的。
<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" alt="" style='width:378pt;height:280.5pt'> <v:imagedata src="file:///C:\DOCUME~1\JACKY_~1\LOCALS~1\Temp\msohtml1\01\clip_image003.png" o:href="http://www.vckbase.com/document/journal/vckbase22/images/TestWTL3.gif"/> </v:shape><![endif]--><!--[if !vml]--> <!--[endif]-->
(3) Next
<!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" alt="" style='width:378pt;height:4in'> <v:imagedata src="file:///C:\DOCUME~1\JACKY_~1\LOCALS~1\Temp\msohtml1\01\clip_image005.png" o:href="http://www.vckbase.com/document/journal/vckbase22/images/TestWTL4.gif"/> </v:shape><![endif]--><!--[if !vml]--> <!--[endif]-->
(4) 在产生的文件中可以看到 WTL 确实不支持 Doc/View.
WTL 对单界面线程的封装: WTL 使用一个 _Module 全局变量来保存全局数据,并通过它来引用应用程序级的代码。在 WTL 中,该变量是 CAppModule 的实例,想象 MFC 的 theApp 。
● 下面对 MyTestWTL.cpp 文件中的函数作一些说明:
Ⅰ :
int WINAPI _tWinMain ( HINSTANCE hInstance , HINSTANCE /*hPrevInstance*/ , LPTSTR lpstrCmdLine , int nCmdShow )
{
HRESULT hRes = :: CoInitialize ( NULL );
// If you are running on NT 4.0 or higher you can use the following call instead to
// make the EXE free threaded. This means that calls come in on a random RPC thread.
// HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
ATLASSERT ( SUCCEEDED ( hRes ));
// this resolves ATL window thunking problem when Microsoft Layer for Unicode (MSLU) is used
:: DefWindowProc ( NULL , 0 , 0 , <chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="l" w:st="on"><span style="color: purple;">0L</span></chmetcnv>);
AtlInitCommonControls ( ICC_COOL_CLASSES | ICC_BAR_CLASSES ); // add flags to support other controls
hRes = _Module . Init ( NULL , hInstance );
ATLASSERT ( SUCCEEDED ( hRes ));
int nRet = Run ( lpstrCmdLine , nCmdShow ); // 程序逻辑,调用全局函数 Run()
_Module . Term (); // 终止模块
:: CoUninitialize ();