WEB开发网
开发学院软件开发VC MFC程序员WTL指南(2)ATL界面类 阅读

MFC程序员WTL指南(2)ATL界面类

 2008-01-19 20:26:41 来源:WEB开发网   
核心提示:如果你仍然需要使用MFC,MFC的窗口和ATL/WTL的窗口可以“和平共处”,MFC程序员WTL指南(2)ATL界面类(2),(例如我工作中的一个原型就使用了了MFC的CFrameWnd,并在其内包含了WTL的CSplitterWindow,将类名作为模板类的参数是因为ATL要做另一件诡秘的事情
  • 如果你仍然需要使用MFC,MFC的窗口和ATL/WTL的窗口可以“和平共处”。(例如我工作中的一个原型就使用了了MFC的CFrameWnd,并在其内包含了WTL的CSplitterWindow,在CSplitterWindow中又使用了MFC的CDialogs -- 我并不是为了炫耀什么,只是修改了MFC的代码使之能够使用WTL的分割窗口,它比MFC的分割窗口好的多)。

    在这一系列文章中,我将首先介绍ATL的窗口类,毕竟WTL是构建与ATL之上的一系列附加类,所以需要很好的了解ATL的窗口类。介绍完ATL之后我将介绍WTL的特性以并展示它是如何使界面编程变得轻而易举。

    对第一章的简单介绍

    WTL是个很酷的工具,在理解这一点之前需要首先介绍ATL。WTL是构建与ATL之上的一系列附加类,如果你是个严格使用MFC的程序员那么你可能没有机会接触到ATL的界面类,所以请容忍我在开始WTL之前先罗索一些别的东西,绕道来介绍一下ATL是很有必要地。

    在本文的第一部分,我将给出一点ATL的背景知识,包括一些编写ATL代码必须知道的基本知识,快速的解释一些令人不知所措的ATL模板类和基本的ATL窗口类。

    ATL 背景知识 ATL 和 WTL 的发展历史

    “活动模板库”(Active Template Library)是一个很古怪的名字,不是吗?那些年纪大的人可能还记得它最初被称为“网络组件模板库”,这可能是它更准确的称呼,因为ATL的目的就是使编写组件对象和ActiveX控件更容易一些(ATL是在微软开发新产品ActiveX-某某的过程中开发的,那些ActiveX-某某现在被称为某某.NET)。由于ATL是为了便于编写组件对象而存在的,所以只提供了简单的界面类,相当于MFC的窗口类(CWnd)和对话框类(CDialog)。幸运的是这些类非常的灵活,能够在其基础上构建象WTL这样的附加类。

    WTL现在已经是第二次修正了,最初的版本是3.1,现在的版本是7(WTL的版本号之所以这样选择是为了与ATL的版本匹配,所以不存在1和2这样的版本号)。WTL 3.1可以与VC 6和VC 7一起使用,但是在VC 7下需要定义几个预处理标号。WTL 7向下兼容WTL 3.1,并且不作任何修改就可以与VC 7一起使用,现在看来没有任何理由还使用3.1来进行新的开发工作。

    ATL-style 模板

    即使你能够毫不费力地阅读C++的模板类代码,仍然有两件事可能会使你有些头晕,以下面这个类的定义为例:

    class CMyWnd : public CWindowImpl<CMyWnd>
    {
       ...
    }; 

    这样作是合法的,因为C++的语法解释说即使CMyWnd类只是被部分定义,类名CMyWnd已经被列入递归继承列表,是可以使用的。将类名作为模板类的参数是因为ATL要做另一件诡秘的事情,那就是编译期间的虚函数调用机制。

    如果你想要了解它是如何工作地,请看下面的例子:

    template <class T>
    class B1
    {
    public:
       void SayHi()
       {
         T* pT = static_cast<T*>(this);  // HUH?? 我将在下面解释
         pT->PrintClassName();
       }
    protected:
       void PrintClassName() { cout << "This is B1"; }
    };
    class D1 : public B1<D1>
    {
       // No overridden functions at all
    };
    class D2 : public B1<D2>
    {
    protected:
       void PrintClassName() { cout << "This is D2"; }
    };
    main()
    {
       D1 d1;
       D2 d2;
       d1.SayHi();  // prints "This is B1"
       d2.SayHi();  // prints "This is D2"
    }

    上一页  1 2 3 4 5 6 7  下一页
  • Tags:MFC 程序员 WTL

    编辑录入:爽爽 [复制链接] [打 印]
    赞助商链接