WTL for MFC Programmers(3)

学习提速专享!AI工具全家桶免费用 限时购周边加赠Coding Plan Lite,解锁20+主流AI工具,写代码、查资料快人一步! 阅读详情

ATL-style templates

Even if you can read C++ templates without getting a headache, there is two things ATL does that might trip you up at first. Take this class for example:

关于C++的模版定义,ATL有两个让人头疼的事情。注意以下的例子:

class CMyWnd : public CWindowImpl<CMyWnd>

{

...

};

That actually is legal, because the C++ spec says that immediately after the class CMyWnd part, the name CMyWnd is defined and can be used in the inheritance list. The reason for having the class name as a template parameter is so ATL can do the second tricky thing, compile-time virtual function calls.

上面的代码是合法,因为C++规定只要在class CMyWnd定义部分的后面,就可以使用CMyWnd,当然也可以将它用在基类表的定义中。这就是为什么类名可以像一个模板参数那样使用,也正是由于这样的特性,ATL就有了第二件狡猾的设计,编译时虚函数调用。

(如果在class CMyWnd的后面马上就可以使用CMyWnd,那么能不能让一个类作自己的子类呢?好像可以,其实是行不通的,因为编译器会去找基类的定义,如果自己做自己的基类,编译器会提示基类没有定义 蜗牛手记)

To see this in action, look at this set of classes:

注意看下面的类定义:

template <class T>

class B1

{

public:

    void SayHi()

    {

    T* pT = static_cast<T*>(this);   // HUH?? I'll explain this below

 

        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"

}

The static_cast<T*>(this) is the trick here. It casts this, which is of type B1*, to either D1* or D2* depending on which specialization is being invoked. Because template code is generated at compile-time, this cast is guaranteed to be safe, as long as the inheritance list is written correctly. (If you wrote

class D3 : public B1<D2>

you'd be in trouble.) It's safe because the this object can only be of type D1* or D2* (as appropriate), and nothing else. Notice that this is almost exactly like normal C++ polymorphism, except that the SayHi() method isn't virtual.

语句static_cast<T*>(this)是一个骗局。它通过这个特殊的调用将类型是B1*this转换为D1*或者D2*。因为模板的代码是在编译时生成的,只要基类烈表示正确的,这种转换保证是安全的。(如果你写出这样的语句:class D3 : public B1<D2>,那你将于遇到麻烦)。这种安全是因为this对象只能根据定义转换为D1*D2*,而不能转换为其他的什么东西。这就像标准C++的多态性一样的,只是SayHi()函数不是虚函数而已。

WTL for MFC Programmers 中英文:深入掌握轻量级Windows开发 Windows Template Library(WTL)是一个轻量级的C++库,用于简化Windows应用程序的开发。它不提供完整的应用程序框架,而是专注于提供一组灵活的工具,用于构建窗口、控件以及与之交互的代码。WTL的设计目标是为开发者提供快速开发小型到中型Windows应用程序的能力,同时保持对应用程序大小和性能的控制。虽然WTL提供了大量预定义的控件类,但有时可能需要根据特定需求创建自定义控件。自定义控件类的开发涉及继承WTL的窗口类模板并实现特定的接口。 阅读详情

相关推荐

WTL for MFC Programmers英文版PDF,附演示代码

注意,是英文版!排版比较好,附演示代码 Part I - ATL GUI Classes Part II - WTL GUI Base Classes Part III - Toolbars and Status Bars Part IV - Dialogs and Controls Part V - Advanced Dialog UI Part VI - Hosting ActiveX Controls Part VII - Splitter Windows Part VIII - Property Sheets and Wizards Part IX - GDI Classes, Common Dialogs, and Utility Classes Part X - Implementing a Drag and Drop Source

WTL for MFC programmer

其实这个文章网上到处是,整理成pdf with bookmark方便查阅 我们的目标是,资源分0,无障碍下载^^

WTL For MFC Programmer(中文版)

WTL For MFC Programmer(中文版).pdf

MFC程序员的WTL开发指南PDF

PDF格式的MFC程序员的WTL开发指南,目录完善,方便阅读。

WTL for MFC Programmers.PDF

WTL for MFC Programmers.PDF

WTL for MFC Programmers(1)

WTL for MFC ProgrammersMFCWTL 原著 Michael Dunn 编译 蜗牛手记译前序       一直以来都是在MFC的平台上开发,忽然有一天开发的东西需要跨入没有MFC的平台上才发现Window编程和MFC编程的区别,如何能够快速的由MFC转入WINDOW平台呢,找来找去发现了WTL这个奇怪的东西。       说它奇怪,一点也不过分,

蜗牛档案室 2903

WTL for MFC Programmers(2)

Introduction to the SeriesWTL rocks. It does. It has a lot of the power of MFCs GUI classes, yet produces substantially smaller executables. If youre like me, and learned GUI programming with MFC,

蜗牛档案室 2316

WTL for MFC Programmers, Part VII - Splitter Windows

WTL for MFC Programmers, Part VII - Splitter Windows原作 :Michael Dunn [英文原文]翻译 :Orbit(星轨 oRbIt) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 介绍 WTL 的分隔窗口 相关的类

oRbIt 的专栏 2980

WTL for MFC Programmers(中文版)

这个资源在网上很多下得到,只不过是html文件包,不方便使用,这个是我做的一个chm文件,希望对大家有用。

WTL for MFC Programmers, Part VI - Hosting ActiveX Controls

WTL for MFC Programmers, Part VI - Hosting ActiveX Controls原作 :Michael Dunn [英文原文]翻译 :Orbit(星轨 oRbIt) [http://www.winmsg.com/cn/orbit.htm]下载演示程序代码本章内容 介绍 从使用向导开始 建立工程

oRbIt 的专栏 4456

WTL for MFC Programmers, Part VIII - Property Sheets and Wizards

WTL for MFC Programmers, Part VIII - Property Sheets and Wizards原作 :Michael Dunn [英文原文]翻译 :Orbit(星轨 oRbIt) [http://www.winmsg.com/cn/orbit.htm]

oRbIt 的专栏 3010

WTL for MFC Programmers, Part I - ATL GUI Classes

README.TXT 在你开始使用WTL或着在本文章的讨论区张贴消息之前,我想请你先阅读下面的材料。 你需要开发平台SDK(Platform SDK)。你要使用WTL不能没有它,你可以使用在线升级安装开发平台SDK,也可以下载全部文件后在本地安装。在使用之前要将SDK的包含文件(.h头文件)和库文件(.Lib文件)路径添加到VC的搜索目录,SDK有现成的工具完成这个工作,这个工具位于开

zcxin的专栏 1609

WTL for MFC Programmers,Part IV - Dialogs and Controls

对第四章的介绍 MFC 的对话框和控件的封装真得可以节省你很多时间和功夫。没有MFC对控件的封装,你要操作控件就得耐着性子填写各种结构并写很多的SendMessage调用。MFC还提供了对话框数据交换(DDX),它可以在控件和变量之间传输数据。WTL 当然也提供了这些功能,并对控件的封装做了很多改进。本文将着眼于一个基于对话框的程序演示你以前用MFC实现的功能,除此之外还有WTL消息处理的增

zcxin的专栏 1164

WTL for MFC Programmers, 中文版序言

WTL for MFC Programmers, Chinese Version Prologue 我一直在寻找这样一个类库:他对Windows的窗口提供面向对象的封装,有灵活的消息响应机制和比较完备的界面框架解决方案,对标准控件提供简练实用的封装,支持操作系统的新特性,支持功能扩充和二次开发,有代码自动生成向导机制,生成的程序使用较少的系统资源,最后是有完全的代码支持和文档支持。你会

oRbIt 的专栏 4033

WTL for MFC Programmers(5)

Defining a Window Implementation定义一个窗体实现Any non-dialog window you create will derive from CWindowImpl. Your new class needs to contain three things:你所产生的任何非对话框的窗体都将从CWindowImpl派生,你需要为你的新类做下面的3件事

蜗牛档案室 1456

WTL for MFC Programmers, Chinese Version Prologue

我一直在寻找这样一个类库:他对Windows的窗口提供面向对象的封装,有灵活的消息响应机制和比较完备的界面框架解决方案,对标准控件提供简练实用的封装,支持操作系统的新特性,支持功能扩充和二次开发,有代码自动生成向导机制,生成的程序使用较少的系统资源,最后是有完全的代码支持和文档支持。 你会说那就用MFC吧! 是的,我一直使用MFC,但我对MFC已经越来越厌倦了。陈旧的类库使得它无法支持

zcxin的专栏 942

WTL for MFC Programmers, Part III - Toolbars and Status Bars

对第三部分的介绍 自从作为Windows 95的通用控件出现以来,工具条和状态条就变成了很普遍的事物。由于MFC支持浮动的工具条从而使它们更受欢迎。随着通用控件的更新,Rebars(最初被称为Coollbar)使得工具条有了另一种展示方式。在第三部分,我将介绍WTL对这些控制条的支持和如何在你的程序中使用它们。 主窗口的工具条和状态条 CFrameWindowImpl有三个HWN

zcxin的专栏 1256
上一篇: WTL for MFC Programmers(4)
下一篇: WTL for MFC Programmers(5)
snaill
博客等级 码龄27年 599粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值