• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2025-03-10 12:59 Aet 隐藏边栏 |   抢沙发  4 
文章评分 1 次,平均分 5.0

WTL下载

  1. WTL

WTL 基础概念

定位与优势

  1. 基于 ATL 的扩展库,专注于高效 Win32 GUI 开发,无 MFC 的臃肿
  2. 优势
    1. 模板驱动:零成本抽象,代码体积小
    2. 兼容 Win32 API:直接操作窗口句柄,灵活性高。
    3. 现代 C++ 风格:支持 RAII、模板元编程

WTL 与 ATL 的关系

  1. 依赖关系:
    1. WTL 依赖 ATL 的窗口类(如 CWindow)和 COM 支持
  2. 扩展功能:
    1. WTLATL 基础上添加了高级控件(如 CListViewCtrl)、UI 布局工具(如 CSplitterWindow

窗口与消息处理

窗口模板类

  1. CWindowImpl:窗口基类,支持消息映射
  2. CDialogImpl:对话框封装
  3. CFrameWindowImpl:主框架窗口

CWindow

  1. 轻量级句柄封装
    1. CWindow是对窗口句柄(HWND)的薄封装,提供对窗口操作API的直接映射,如ShowWindowMoveWindow
    2. 仅包含m_hWnd作为窗口句柄,无额外冗余数据,确保对象占用最小内存
    3. 通过重载operator HWND(),允许将CWindow对象隐式转换为HWND,实现与原生API的无缝兼容
  2. 方法封装策略
    1. SendMessage等函数封装为成员方法,例如SendMessage变为CWindow::SendMessage,并利用模板参数校验消息参数类型
    2. 提供AttachDetach方法,显式控制句柄所有权,避免MFC中隐含的资源管理开销
  3. CWindowImpl的协作
    1. CWindowImpl通常以CWindow作为模板基类(TBase参数),继承其窗口操作方法,同时扩展窗口创建和消息处理功能
    2. CWindow仅负责窗口操作,而窗口的生命周期管理(如注册窗口类、创建窗口)由CWindowImpl处理

CWindowImpl

  1. 用途
    1. 用于创建自定义窗口,处理窗口消息(如 WM_PAINTWM_CREATE 等)
  2. 继承关系
    1. 继承自CWindowImplCWindowImplBaseTCWindowImplRootCMessageMap
    2. 继承自 CWindow(ATL 的窗口句柄封装类),通过模板实现消息映射
  3. 特性
    1. 消息映射宏:通过 BEGIN_MSG_MAPEND_MSG_MAP 定义消息处理逻辑
    2. 窗口类注册:支持动态注册窗口类(通过 DECLARE_WND_CLASS
    3. 灵活性:可以自定义窗口样式、扩展样式和窗口过程
  4. 场景
    1. 需要完全自定义的窗口(如游戏界面、绘图工具)
    2. 实现非标准控件(如自定义按钮、图表控件)
  5. 示例

CDialogImpl

  1. 功能
    1. 用于创建模态或非模态对话框,支持对话框资源模板和控件消息处理
  2. 继承关系
    1. CDialogImpl<T, TBase>CDialogImplBaseT<TBase>CWindowImplRoot<TBase>
    2. CDialogImplBaseT<TBase>
      为对话框提供基础的消息处理框架和窗口过程(DialogProc),并通过模板参数 TBase 支持基类扩展(默认基类为 CWindow
    3. CWindowImplRoot<TBase>
      作为继承链的根类,确保窗口对象销毁时关联的窗口句柄(HWND)已被正确销毁
  3. 特性
    1. 对话框资源绑定:通过 enum { IDD = IDD_MYDIALOG } 关联资源文件中的对话框模板
    2. 控件消息处理:使用 COMMAND_HANDLERNOTIFY_HANDLER 响应按钮点击、列表项选择等事件
    3. 数据交换(DDX):通过 BEGIN_DDX_MAPEND_DDX_MAP 简化控件与变量的数据同步
  4. 场景
    1. 配置窗口(如设置选项、用户登录)
    2. 数据输入表单(如新建文件、编辑属性)
  5. 示例

CFrameWindowImpl

  1. 用途
    1. 用于创建应用程序的主窗口,支持菜单、工具栏、状态栏等复杂 UI 元素
  2. 继承关系
    1. CFrameWindowImplCFrameWindowImplBaseCWindowImplBaseT<TBase>
  3. 特性
    1. 框架布局:支持嵌入子窗口(如视图、工具栏)
    2. 消息链(Message Chaining):通过 CHAIN_MSG_MAP 将消息路由到子控件
    3. UI 更新机制:通过 CUpdateUI 自动启用/禁用菜单项和工具栏按钮
  4. 场景
    1. 应用程序主窗口(如文本编辑器、资源管理器)
    2. 多文档界面(MDI)的框架窗口
  5. 示例

消息映射机制

消息链

  1. 将消息路由到父窗口或子控件

消息处理函数

动态 UI 更新

  1. CUpdateUI 机制:自动更新菜单项和工具栏状态

自定义窗口样式

  1. 修改窗口样式:在 PreCreateWindow 中调整 CREATESTRUCT

控件封装

常用控件

  1. CButtonCEditCListBoxCComboBox

高级控件

  1. CListViewCtrlCTreeViewCtrlCStatusBarCtrl

控件操作

资源管理

  1. 资源文件.rc
    1. 定义对话框、菜单、图标等资源
  2. 对话框数据交换(DDX):

高级 UI 功能

多文档界面(MDI)

  1. CMDIFrameWindowImpl:MDI 主框架
  2. CMDIChildWindowImpl:MDI 子窗口

分割窗口

工具栏与状态栏

  1. CToolBarCtrlCStatusBarCtrl

GDI与绘图

  1. 封装类
    1. CDC(设备上下文)、CPenCBrush
  2. 双缓冲绘图

多线程与UI

UI线程安全

  1. 通过 PostMessageSendMessage 跨线程更新 UI

现代 C++ 特性集成

  1. Lambda 表达式:简化消息处理

  1. 智能指针:结合 std::unique_ptr 管理资源

自定义控件与 Owner-Draw

  1. 自定义绘制
    1. 重写 OnPaint 或响应 WM_DRAWITEM

国际化与本地化

  1. 多语言资源:通过资源 DLL 切换语言。
  2. 动态字符串加载:

示例程序

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享