WTL学习记(一):初识WTL

最近尝试了解WTL在UI上的应用,实属彻彻底底的初学者,所以只是在此写上一些纯属个人认识。
(若是能抛个砖头引玉最好!)

一、WTL的安装
      WTL的最新版本8.1,但WTL8.1不支持在VC6上直接安装,建议你安装WTL7.0版本。也有称可手动安装,我也在网上搜索到了些方法,但是没有去尝试(我不敢保证之后会不会出现让VC大惊小怪的问题,若你对其感兴趣,我只能保证一定能搜索的到方法)。
      其实关于WTL的安装本无可说,只是或许如我一样的初学者会有一些疑惑。因为WTL中setupXX.js安装文件只是为你的VC安装了WTL的AppWiz,安装后VC的New->Project中会添加选项ATL/WTL AppWizard,但并没有自动将WTL工程所需的atl类.h文件(这些文件都在WTL安装文件的Include目录中)导入到你的VC安装路径中。若你和我一开始一样,以为双击了安装文件就可以将安装包删除了,那么你就和我一般犯了个低级错误。建议的安装方法是:1.首先在你的VC安装目录下新建目录WTL(可以是其他自定任意合法目录名称),然后将安装包(自解压文件)解压到此目录中,双击目录AppWiz\setupXX.js安装;2.打开VC6.0,Tools->Options->Directory->Include files中将WTL中的include目录路径添加进去。如果你用的是VS2008,选择Tools->Options->Project and solutions->VC++ Directories->Include files。

二、WTL初识
      WTL是构建与ATL之上的一系列附加类,你会发现WTL安装目录中的include中都是以atl开头命名的一些.h文件,在学习WTL之前,有必要对ATL_style C++模板类有所理解,VC知识库(http://www.vckbase.com/document/viewdoc/?id=1319)中对此有较细的分析。
      了解了ATL-style模板类,接下来就开始介绍WTL了。
      WTL的类大致可以分为几种类型:
            1.主框架窗口的实现- CFrameWindowImpl, CMDIFrameWindowImpl 
            2.控件的封装- CButton, CListViewCtrl 
            3.GDI 对象的封装- CDC, CMenu 
            4.一些特殊的界面特性 - CSplitterWindow, CUpdateUI, CDialogResize, CCustomDraw 
            5.实用的工具类和宏- CString, CRect, BEGIN_MSG_MAP_EX 
      今天介绍下WTL的窗口类,任何非对话框窗口都是从CWindowImpl 派生的,对话框窗口派生自CDialogImpl或CAxDialogImpl,CDialogImpl 用于实现普通的对话框而CAxDialogImpl实现含有ActiveX控件的对话框。通常,利用WTL的AppWizard新建一个WTL工程,WTL AppWizard会自动将我们窗口类从这些基类派生,所以重点说下如何对WTL的窗口添加消息响应。
      WTL通过在自己的派生类中利用宏BEGIN_MSG_MAP和END_MSG_MAP维持一个类似MFC的消息映射链:
      class CMyWindow : public CFrameWindowImpl<CMyWindow>
      {
      public:
          BEGIN_MSG_MAP(CMyWindow)
          END_MSG_MAP()
           // ...
      };
      在BEGIN_MSG_MAP和END_MSG_MAP之中添加需要处理的消息的映射,然后声明消息处理函数、实现消息处理函数。
      在此,添加一个WM_ERASEBKGND消息的响应,在OnEraseBKgnd()中我们在窗口中显示字符串"WTL APP":
      // MyWindow.h
      class CMyWindow : public CFrameWindowImpl<CMyWindow>
      {
      public:
          BEGIN_MSG_MAP(CMyWindow)
                 MSG_WM_ERASEBKGND(OnEraseBkgnd)
          END_MSG_MAP()

          LRESULT OnEraseBkgnd ( HDC hdc );
      };

      // MyWindow.cpp
      LRESULT OnEraseBkgnd ( HDC hdc )
      {
            CDCHandle  dc(hdc);
            CRect      rc;
            GetClientRect ( rc );
            dc.SaveDC();
            dc.SetTextColor ( RGB(0,0,0) );
            dc.ExtTextOut ( 0, 0, ETO_OPAQUE, rc, "My First WTL Window", strlen("My First WTL Window"), NULL );

            dc.RestoreDC(-1);
            return 1;   
      }

      好,今天就写这些了。明天继续学习。。。
posted @ 2009-07-23 21:51  MeanX  阅读(2847)  评论(2编辑  收藏  举报