分享
 
 
 

初识WTL(上)

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

初识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

2) http://www.microsoft.com/downloads/details.aspx?familyid=128e26ee-2112-4cf7-b28e-7727d9a1f288&displaylang=en

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,如图:

(2) OK后,

SDI(Single Document Interface)应用程序通常只有一个主窗口(通常是一个框架窗口,Frame Window)。框架窗口包含菜单、工具栏、状态栏和称为视(View)的客户工作区。

Multip-SDI(Multiple Threads SDI),就像IE浏览器,使用"文件/新建/窗口"命令后,会出现另一个IE窗口。

MDI(Multiple Document Interface)应用程序有一个主框架窗口,但有多个子框架窗口。每个子窗口都有自己的视(View),和MFC的相似。

Dialog应用程序是基于对话框的。

(3) Next

(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, 0L);

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();

return nRet;

}

入口函数名为_tWinMain()。当使用UNICODE时,编译器会将它替换为wWinMain(),否则,为WinMain()。入口函数其实就是主线程(_Module)的起始点,这和SDK,MFC一个道理。一个_Module还维持一个消息循环Map。

Ⅱ:

int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)

{

CMessageLoop theLoop;

_Module.AddMessageLoop(&theLoop);

CMainFrame wndMain;

if(wndMain.CreateEx() == NULL)

{

ATLTRACE(_T("Main window creation failed!\n"));

return 0;

}

wndMain.ShowWindow(nCmdShow);

int nRet = theLoop.Run();

_Module.RemoveMessageLoop();

return nRet;

}

该函数创建了一个CMessageLoop实例,该实例包含了这个线程的消息循环。这些消息循环都放在模块的全局消息循环中,通过线程的ID来索引。这样,该线程的其它代码就能访问得到。每一个应用程序维护一个消息循环队列Map,应用程序中的每个线程都通过"_Module.AddMessageLoop(&theLoop)",把该线程的消息循环加入到_Module的消息循环Map中。消息循环对象包含了消息过滤和空闲处理。每个线程都可以加入空闲处理代码和消息过滤。

● 添加代码:

Ⅰ:在stdafx.h中添加:#include <atlctrls.h

#include <atlctrlx.h

#include <atlctrlw.h//这三个是WTL 中实现常用控件类

#include <atldlgs.h

#include <atlmisc.h//WTL 使用类像 CString等

#include <atlddx.h//WTL 使用像MFC中DDX/DDV 机制

Ⅱ:添加3个图标资源:IDR_DEFAULT, IDR_DATE, IDR_TIME

Ⅲ:在MainFrm.h中添加 CMultiPaneStatusBarCtrl m_Mstatus;

Ⅳ:在MainFrm.cpp中添加

在函数最前面声明两个数组:static int arrPanes[] = { IDR_DEFAULT, IDR_DATE, IDR_TIME };

static int arrWidths[] = { 450,200, 600 }; //你自己修改一下值看看有什么不同

在OnCreate函数中添加:CreateSimpleStatusBar();

m_Mstatus.SubclassWindow(m_hWndStatusBar);

m_Mstatus.SetPanes(arrPanes,sizeof(arrPanes)/sizeof(int), false);

m_Mstatus.SetPaneWidth(IDR_DEFAULT,400);

m_Mstatus.SetPaneWidth(IDR_DATE,200);

m_Mstatus.SetPaneWidth(IDR_TIME,900);

m_Mstatus.SetPaneIcon(IDR_DEFAULT,AtlLoadIconImage(IDR_DEFAULT, LR_DEFAULTCOLOR));

m_Mstatus.SetPaneIcon(IDR_DATE, AtlLoadIconImage(IDR_DATE, LR_DEFAULTCOLOR));

m_Mstatus.SetPaneIcon(IDR_TIME, AtlLoadIconImage(IDR_TIME, LR_DEFAULTCOLOR));

m_Mstatus.SetPaneText(IDR_DATE,"WTL is very wonderful!",0);

m_Mstatus.SetPaneText(IDR_TIME,"WWW.VCKBASE.COM",0);

这些代码相信大家一看就会明白! 参考资料:

深入剖析WTL——Win32模型,作者:建新

WTL for MFC Programmers 作者:Michael Dunn

在此深表感谢

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有