WTL源码剖析 --- ATLAPP.H

本文深入剖析了WTL库中ATLAPP.H头文件的相关内容,包括CmessageFilter、CidleHandler、CmessageLoop、CappModule和CserverAppModule等类的作用和实现。通过CAppModule的AddMessageLoop和RemoveMessageLoop管理消息循环,以及CMessageLoop的Run函数维持消息处理。文章详细解释了应用程序从启动到关闭的关键流程,并分析了Run函数中的消息处理机制。
摘要由CSDN通过智能技术生成

作者:姜江
QQ:457283
E-mail:jznsmail@163.net

ATLAPP.H
包含了消息循环类、接口类、和产生应用程序所必需的一些基础类定义。

       类定义如下:

              CmessageFilter---用于消息过滤的

        CidleHandler  ---用于空闲消息处理的

        CmessageLoop---用于消息循环的

              CappModule  ---应用程序基础类

              CserverAppModule---用于Com服务构架的应用程序类

       另外还有3个全局函数:

              AtlGetDefaultGuiFont()获得默认的显示字体

              AtlCreateBoldFont()   产生一个粗体字体

              AtlInitCommonControls()初始化一些控件所需共同的DLL

      WTL程序的结构

       一个窗口程序的创建到销毁过程主要经过如下几个阶段

1.  注册窗口类

2.  创建窗口

3.  进入消息循环

如果用C写过Win32窗口程序的人一定会记得如下的结构:

//窗口过程处理函数

LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)

{

          HWND hwnd = NULL;

          MSG msg;

         

          WNDCLASS wndclass;

          wndclass.style       = CS_HREDRAW | CS_VREDRAW;

          wndclass.lpfnWndProc = WndProc;

    

     //注册窗口

     if(!RegisterClass(&wndclass))

     {

          MessageBox(NULL,TEXT("Porgram requires Windows NT!"),szAppName,MB_ICONERROR);

          return 0;

          }

     //创建窗口

     hwnd = CreateWindow(szAppName,TEXT("My Application"),

     WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,

     CW_USEDEFAULT,CW_USEDEFAULT,

     CW_USEDEFAULT,CW_USEDEFAULT,

     NULL,NULL,hInstance,NULL);

 

          ShowWindow(hwnd,iCmdShow);

          UpdateWindow(hwnd);

        

         //进入消息循环

          while(GetMessage(&msg,NULL,0,0))

          {

               TranslateMessage(&msg);

               DispatchMessage(&msg);

     }

 

     return msg.wParam;

}

那么你可能会问WTLWinMain函数再哪里?如果你通过WTL/ATL导向生成一个应用程序,那么你会在跟工程名字同名的.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);//程序的关键分

 

     _Module.Term();

     ::CoUninitialize();

 

     return nRet;

作为现代C++最重要的特色技术,template正在各个传统领域攻城略地。从基本算法与数据结构,到正则表达式与XML解析,从高性能数学计算,到资源 的分配与管理,从网络分布式计算环境,到组件模型创建,从静态多态性的维度扩展,到设计模式的自动生成,神奇的template显示出其令人叹为观止的强 劲实力,如果不是有一个隐隐的痛处,template爱好者简直可以去狂欢了。 这个隐隐的痛处,就是在GUI编程领域。 现 有的大部分成熟GUI框架和工具库,其定型时间都在90年代早期,不管是因为什么原因,总之我们根本看不到template技术在这些环境中的任何重要运 用。无论是专有MFC和OWL,还是开源的wxWindow和Mozilla, 以至于是专有还是开源都说不清楚的Qt,它们在其他方面有着诸多不同,偏偏倒是在对待模板技术上空前一致:严格限制在底层的数据结构领域内,抵制模板技术 流入GUI主体结构。最过分的wxWindow和Mozilla,在代码编写规范里严厉禁止使用1990年之后发展出来的任何C++特性,模板、异常、多 继承、STL等等,均在黑名单上。诸位有兴趣,不妨去看看,那与其说是一份C++代码编写规范,倒不如说是对C++现代特性在GUI领域应用的一份不公正 的判决书。 难道模板技术真的在GUI领域无用武之地吗? WTL给出了一个响亮的回答。 WTL是微软 ATL开发组成员Nenad Stefanovic先生在ATL Windowing机制上发展起来的一整套GUI框架,运用template技术组织和创建GUI对象,构筑了精致的面向对象框架(没错,在这里 object oriented与template达成了精致的融合)。虽然没有获得微软的官方支持,虽然其使用者人数很少,但是确实是“用过的都说好”,有位微软 MVP人士甚至说,这是微软有史以来推出的最优秀的一个framework。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值