ATL中的CWindowImpl模板类

ATL学习实践(VC8)-用CWindowImpl实现窗口 用CWindowImpl实现窗口一、新建工程。在VC8创建一个ATL Project工程。名称为ATL_Test,,Server Type为Executable(EXE),完成。 二、新建窗口类。添加一个C++类,做为窗口类。向导中填写类名CMyWindow,基类CWindowImpl,OK。在stdafx.h中包含头文件:#include 生成代码如下://version 阅读详情

首先看一下这个模板类的声明

template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits> class CWindowImpl;

从声明中可以看出,有两个默认参数。
TBase是默认的窗口基类,这个CWindow简单封装了HWND,并且封装了几乎所有的Use32 APIs中以HWND为第一个参数的接口。CWindow提供一个共有的成员m_hWnd,可以直接处理HWND,也提供了一个operator HWND(),可以直接是CWindow作为需要HWND对象的函数参数。CWindow不同于MFC中的 CWnd。CWindow易于创建的,它不提供像MFC中的HWND到CWnd的对象关系。当CWindow对象超出作用域时,它被销毁,但是它关联的实际窗口不会被销毁。因此不需要detach你创建的临时的CWindow对象。
TWinTraits 是默认的窗口特征。
接下来,看一下它的定义的代码:

template <class T, class TBase /* = CWindow */, class TWinTraits /* = CControlWinTraits */>
class ATL_NO_VTABLE CWindowImpl :
    public CWindowImplBaseT< TBase, TWinTraits >

在这里又继承了CWindowImplBaseT模板类。它的定义如下:

template <class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImplBaseT : 
    public CWindowImplRoot< TBase >

可以看出,最终继承了CWindowImplRoot模板类,它的定义如下:

template <class TBase /* = CWindow */>
class ATL_NO_VTABLE CWindowImplRoot : 
    public TBase, 
    public CMessageMap

这个CWindowImplRoot类继承了一个TBase和CMessageMap。TBase默认就是CWindow类。当然,这个TBase基类也可以使用自己封装的,但一般情况下使用CWindow就可以了。另外一个CMessageMap类,声明如下:

class ATL_NO_VTABLE CMessageMap
{
public:
    virtual BOOL ProcessWindowMessage(
        _In_ HWND hWnd,
        _In_ UINT uMsg,
        _In_ WPARAM wParam,
        _In_ LPARAM lParam,
        _Inout_ LRESULT& lResult,
        _In_ DWORD dwMsgMapID) = 0;
};

这是一个抽象基类,作用仅仅是提供了一个处理消息映射的接口。所有继承CMessageMap的类必须实现这个接口。在这个抽象基类中,另外一个需要注意的成员函数如下

    void SetMsgHandled(_In_ BOOL bHandled)
    {
        _ATL_MSG* pMsg = (_ATL_MSG*)GetCurrentMessage();    // override const
        ATLASSUME(pMsg != NULL);
        ATLASSERT(pMsg->cbSize >= sizeof(_ATL_MSG));
        pMsg->bHandled = bHandled;
    }

在这里有一个_ATL_MSG是对继承MSG,并对MSG简单做了包装。这个函数的作用就是设置消息是否被处理过了。如果设置为TURE,就不再向下传递,如果设置为FALSE,就继续向下传递。
到此,CWindowImplRoot模板类算是说完了。再向上看一下CWindowImplBaseT模板类。在这个类中,提供了获取窗口风格、获取窗口过程函数、子类化、创建和销毁窗口等相关成员函数。
最后,再来说说CWindowImpl模板类。它提供了获取标题和创建窗口两个成员函数。它的创建窗口函数,是调用了CWindowImplBaseT中提供的静态成员Create函数。
总结一下:
1.CWindowImplRoot类,继承了CWindow和CMessageMap。
2.CWindowImplBaseT类,继承CWindowImplRoot类,这里面又提供了窗口过程相关的函数、创建和销毁窗口的函数等等。
3.CWindowImpl类,继承了CWindowImplBaseT类,给出了获取标题和创建窗口成员函数。

ATL与WTL ATL(Active Template Library)是基于COM技术的C++模板库,主要包含COM组件开发、窗口类和消息处理等功能。核心特性包括: 关键技术:COM组件模型、C++模板和多继承 窗口类体系:提供CWindow、CWindowImpl等类实现窗口创建和消息处理 对话框支持:通过CDialogImpl等类实现模式/无模式对话框 辅助工具:WTL Helper可快速生成控件和消息映射代码 阅读详情

相关推荐

CWindowImpl

template class ATL_NO_VTABLE CWindowImpl :  public CWindowImplBaseT { public:  DECLARE_WND_CLASS(NULL)  static LPCTSTR GetWndCaption()  {   return NULL;  }  HWND Create(   _In_opt_ HWND hW

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 2187

CWindowImpl类

这个类允许你创建一个新的窗口或使一个存在的窗口变成一个子类。CWindowImpl窗口程序使用消息映射来导向详细到响应的句柄。template class TBase = CWindow, class TWinTrait = CControlWinTraits >class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT 参数:T:你的类,继

书山有路勤为径,学海无涯苦作舟 4811

CWindowImpl ATL对象向导

这是一个ATL对象向导,可简化使用CWindowImpl的窗口开发。 它删除了类实现之间多余的代码复制-n-粘贴。

WTL 基础: CWindowImpl 发现

CWindow 其实只是一个数据结构或者分类。

xianlaowu的专栏 2358

国产HDMI2.0芯片GSV2011怎么选?手把手教你用它设计音视频采集卡(附FPGA/海思对接指南)

本文详细解析国产HDMI2.0芯片GSV2011在音视频采集卡设计中的应用,涵盖芯片选型、硬件设计要点及与FPGA/海思平台的对接指南。GSV2011凭借4K@60Hz支持、音频提取嵌入功能和高集成度,成为音视频设备的核心选择,助力开发者快速实现高性能采集卡设计。

weixin_30181209的博客 332

Uniapp H5端SEO优化全攻略:提升搜索引擎排名与流量

在移动互联网时代,H5页面因其跨平台、低成本、易传播的特性,成为许多企业的首选。Uniapp作为一款优秀的前端跨端开发框架,能够快速开发H5、小程序、App等多端应用。然而,由于Uniapp默认采用SPA(单页应用)架构,H5端在SEO(搜索引擎优化)方面存在一定劣势,如爬虫难以抓取动态内容、页面标题和描述不易优化等。 本文将系统性地介绍Uniapp H5端的SEO优化方案,涵盖基础优化、SPA优化策略、内容优化、技术优化、外部优化及监测分析,帮助开发者提升网站在搜索引擎中的排名,获取更多自然流量。

vvilkin的学习备忘 1973

WTL入门(4)--- 对话框和控件

[源代码下载:http://download.youkuaiyun.com/source/3522801] MFC中,对话框和控件的封装节省了我们大量的时间和成本,否则我们需要编写大量的消息处理来管理各个控件。MFC提供了Dialog Data Exchange(DDX,对话框数据交换,对

在水一方 8679

SNAP实战:哨兵1 SLC数据预处理全流程详解(附避坑指南)

本文详细解析了使用SNAP软件处理哨兵1号SLC数据的完整预处理流程。从轨道精校正、辐射定标到多视与斑点滤波,再到地理编码,文章提供了清晰的操作步骤与核心逻辑,并重点分享了实践中的常见“坑”与解决方案,旨在帮助用户高效、准确地完成SAR数据预处理。

7up55的博客 1027

WTL入门(2)-- WTL基础

源代码下载:http://download.youkuaiyun.com/source/3522792 WTL Overview WTL的类可以分为以下几类: 1)窗口实现类 - CFrameWindowImpl, CMDIFrameWindowImpl … 2)控件封装类 - CB

在水一方 6041

HTTPS接口测试翻车实录:为什么浏览器能访问而curl报证书错误?

本文深入分析了HTTPS接口测试中浏览器访问正常而curl报证书错误的典型问题。通过对比浏览器、Postman和curl的工具行为差异,结合Nginx日志与Wireshark抓包,揭示了问题根源在于网络架构中HTTPS请求被意外“降级”为HTTP传输,导致SSL握手失败。文章重点探讨了curl工具严格验证机制暴露的`Peer's Certificate issuer is not recognized`错误,并提供了网络配置修正方案与标准化测试流程。

u9v0w的博客 279

Halcon频域滤波实战:5分钟搞定傅里叶变换与功率谱分析(附完整代码)

本文提供Halcon频域滤波的实战指南,重点讲解如何利用傅里叶变换与功率谱分析快速解决图像处理难题。通过核心算子fft_image和power_real,演示了从空间域转换到频域、分析功率谱以定位周期性噪声,并构造滤波器进行精准去除的完整流程,附有可直接运行的代码示例。

docker8compose的博客 215

使用ATL::CWindowImpl实现Win32窗口

开发大型GUI界面程序MFC当仁不让,但如果是开发图形应用程序,并不需要大规模界面控件,没有必要链接庞大的MFC库,直接使用platform sdk会很麻烦,这时ATL中的关于Windows的封装就是最好的选择 [cpp] view plaincopy #include    #include    class CMyWindow

syflyhua的专栏 1243

Quartz定时任务调度框架中的Misfire策略实战解析

本文深入解析了Quartz定时任务调度框架中的Misfire(失火)处理策略。针对SimpleTrigger和CronTrigger两种常用触发器,详细对比了其各自的Misfire指令(如NowWithExistingCount、FireAndProceed等)的核心行为与适用场景,并提供了基于不同业务需求(如数据补跑、时间点敏感度)的实战选型指南,帮助开发者构建更健壮可靠的任务调度系统。

weixin_29250573的博客 76

ATL7窗口类详细剖析

前言:  ATL是微软继MFC之后提供的一套C++模板类库,小巧、精妙、效率极高。它的主要作用是为我们编写COM/DOM/COM+程序提供了丰富的支持。但是ATL只能写COM么?我以前只是MFC程序员的时候,一直有此误解。但其实ATL提供了很多类用来帮助编写WIN32窗口程序,可能没有MFC使用的广泛和方便(当然啦,因为ATL本来难度就较一般的C++类库大)。用ATL编写WIN32窗口程序有什么...

weixin_33862514的博客 134

【无标题】ReaxFF拟合参数以及算法安装

ReaxFF拟合参数以及算法安装

zmzyzm的博客 1419

【Dify】知识库智能检索应用

本文介绍了一个基于大语言模型的知识库检索系统,实现从自然语言提问到智能回答的自动化流程。该系统通过知识检索节点定位相关信息,利用重排序模型优化结果,最后由大语言模型生成自然语言答案。核心模型包括InternLM2-7B和BCE重排序模型。工作流程包含输入问题、检索重排序、智能生成和答案输出四个阶段,适用于企业知识管理、客户支持、教育培训等多种场景,能显著提升信息检索效率和准确性。文章还提供了相关开发文档链接,涵盖AIGC工具平台搭建、常见问题解决等内容。

Mr数据杨 1000

WTL for MFC Programmers, Part I - ATL GUI Classes

原作 :Michael Dunn [英文原文] 翻译 :Orbit(桔皮干了) [http://www.winmsg.com/cn/orbit.htm] 下载演示程序代码 本章内容 README.TXT 对本系列文章的总体介绍 对第一章的简单介绍 ATL 背景知识 ATL 和 WTL的发展历史 ATL-style 模板 ATL 窗口类 定义一个窗口的实现 填

学习,思考,记录 614

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++模板会使代码膨胀吗

今天和同事说到C++模板会使代码膨胀, 可同事觉得不会。同事的依据是: 如果模板会使代码膨胀, 那么ATL和WTL里为什么还要大量使用模板? 同样功能 ,ATL和WTL编译出的可执行文件可比MFC编译的要小的多。我当时一愣 ,事实确实如同事所说,难道模板会使代码膨胀的观点是错误的吗?MFC因为本身代码量和复杂性在那里, 所以它生成比较大的exe无可厚非。我们这里重点关注为什么ATL/WTL使用模板...

weixin_34019929的博客 1765

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ATL3.0中的窗口类

ATL3.0中的窗口类 作者:Michael Park 译者:京山游侠原文出处: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvc60/html/atlwindow.asp 摘要:讨论Active Template Library (ATL) 3.0中的一些

伏龙的专栏 1132

在ATL中实现窗口

ATL提供了一些工具类以实现窗口,这样在ATL组件里就可以不依赖MFC而很方便的创建窗口。   一、实现对话框   ATL中有三个模板类可用于创建一个对话框:   (1)CSimpleDialog:创建模式对话框, 可以host Windows Controls template < WORD t_wDlgTemplateID, BOOL t_bCenter = TRUE >cla

★果冻★的专栏 1872

CWindowImpl 的作用

http://msdn.microsoft.com/en-us/cc451373(zh-cn,VS.71).aspx使用 CWindowImpl 实现窗口若要实现窗口,请从 CWindowImpl 派生类。在派生类中声明消息映射和消息处理函数。现在可以以三种不同的方式使用类: 基于新的 Windows 类创建窗口为现有 Windows 类创建超类为现有窗口创建子类基于新 Windows 类创建窗口CWindowImpl 包含声明 Windows 类消息的 DECLARE_WND_CLASS 宏。该宏实现 G

WINCOL的专栏 2981

ATL中的窗口类及常见的窗口处理情况

ATL中的窗口类及常见的窗口处理情况1、ATL中的窗口类(CWindow):        CWindow类作为ATL中的窗口类,它主要实现了对窗口进行管理和操作的基本功能;它提供的很多方法都是对Win32 API函数的简单封装。       在实际的应用中,我们可以根据自己的需要,合理的使用CWindow类的子类CWindowImpl、CContainedWindow、CDialog

poty 2087

使用ATL来写个简单的窗口程序

 使用ATL来写个简单的窗口程序    用mfc写个窗口程序实在是太简单,vs中的向导就可以直接帮助你完成,但用想完全的控制它则不是一件容易的事情。    而ATL则正好相反,用它写窗口程序一切都要自己敲,但完全控制它是件很轻松的事情,但前提是你必须了解win32编程    建立一个简单的窗口无外乎下面几步    1. 窗口类定义    2. 窗口类的消息链    3. 窗口使用的窗口类型  

做好我自己 1317

ATL的GUI程序设计(3)

第三章 ATL的窗口类CWindowImpl、CWindow、CWinTraits,ATL窗口类的奥秘尽在此三者之中。在本章里,李马将为你详细解说它们的使用方法。另外,本章的内容也可以算是本书的核心部分——如果你要进行ATL的GUI程序设计的话,就必须将ATL的窗口类设计理念了然于心。窗口的组成把ATL的窗口类撇开不谈先。我在上一章中提到:窗口类并非任何一种OOP语言中的类——它所包括

马说@优快云 4769

ATL中的trunk

ATL用类封装了Windows的操纵。但窗口函数必须是静态函数,不可以是类函数。trunk可以将静态函数,转到类函数里。 ModuleHelper::AddCreateWndData(&m_thunk.cd, this); 可以将CWindowImp的的this指针存入trunck结构中。 CWindowImplBaseT< TBase, TWinTraits >* ...

weixin_33724046的博客 725
上一篇: 虚拟继承和模板继承
路遇天使
博客等级 码龄14年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值