• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2022-03-01 21:43 Aet 隐藏边栏 |   抢沙发  11 
文章评分 3 次,平均分 5.0

Windows点击X关闭窗口的过程

  1. WM_CLOSE
    1. 这是点击“X”按钮后产生的第一个消息,是一个关闭请求
    2. 应用程序可以在此阶段决定是否允许关闭
    3. 例如,如果文档有未保存的修改,程序可以弹出一个对话框询问用户是否保存
  2. WM_DESTROY
    1. 当窗口确定要关闭时(通常是调用了 DestroyWindow函数),系统会发送 WM_DESTROY 消息
    2. 这个消息标志着窗口正在被销毁,是程序进行最终清理工作的信号,例如释放内存、关闭文件句柄等
  3. WM_QUIT
    1. WM_DESTROY消息的处理中,程序通常会调用 PostQuitMessage函数,该函数会向应用程序的消息队列中放入一个 WM_QUIT 消息
    2. 这个消息的使命很特殊:它并不会传递给窗口过程,而是被消息循环中的 GetMessagePeekMessage函数捕获
    3. 一旦 GetMessage取到 WM_QUIT,它就会返回0,从而导致消息循环结束,最终使得程序的主函数(如 WinMain)退出,进程终止

基类指针转派生类

dynamic_cast

  1. 特征
    1. 用于多态类型(有虚函数),进行安全的向下转型
  2. 安全性
    1. 失败返回nullptr或抛异常
  3. 时机
    1. 运行时
  4. 场景
    1. 当不确定基类指针是否指向目标派生类对象时
  5. 注意
    1. 基类必须至少有一个虚函数(即必须是多态类型)

static_cast

  1. 特征
    1. 用于相关类型间的转换,不进行运行时类型检查
  2. 安全性
    1. 依赖程序员保证
  3. 时机
    1. 编译时
  4. 场景
    1. 当确定基类指针指向的就是目标派生类对象时
  5. 注意
    1. 仅当百分之百确定基类指针指向的就是目标派生类对象时使用
    2. 一旦判断失误,使用 static_cast进行错误的向下转型会导致严重问题

C风格强制转换

  1. 特征

    1. (Derived*)basePtr,强大但危险
  2. 安全性

    1. 无类型检查
  3. 时机

    1. 编译时
  4. 场景

    1. 不推荐在C++中使用,可能存在风险

reinterpret_cast

  1. 特征

    1. 低级别的比特位重新解释
  2. 安全性

    1. 非常危险
  3. 时机

    1. 编译时
  4. 场景

    1. 几乎不用于类层次结构的向下转型
  5. 注意

    1. 这个操作是“重新解释”底层的比特模式,完全不考虑类的继承关系和内存布局

Windows透明窗口

分层窗口 (WS_EX_LAYERED)

  1. 概述
    1. 最经典和直接的透明窗口实现方式,主要通过设置窗口的扩展样式 WS_EX_LAYERED来实现
  2. SetLayeredWindowAttributes:此函数允许你通过两种方式实现透明:
    1. 整体透明度 (Alpha):设置 LWA_ALPHA标志和一个 0(全透)到 255(不透明)之间的 Alpha 值,使整个窗口(包括其上的控件)呈现统一的半透明效果
    2. 颜色键透明 (Color Keying):设置 LWA_COLORKEY标志并指定一种颜色(如 RGB(0, 255, 0)),则窗口中所有为该颜色的像素将变为完全透明,常用于创建异形窗口
  3. UpdateLayeredWindow:这个方法功能更强大
    1. 它允许你提供一个包含 Alpha 通道的位图(如 32 位的 ARGB 格式),从而实现每像素级别的透明度控制(类似 PNG 图片的透明效果)
    2. 这对于创建非矩形复杂透明窗口非常有用
    3. 需要注意的是,使用此方法后,窗口将不再接收典型的 WM_PAINT消息,你需要自行管理窗口内容的绘制和更新

DWM 相关 API

  1. 概述
    1. Windows Vista 及之后系统引入了桌面窗口管理器 (DWM),它利用 GPU 进行桌面合成,也提供了实现透明效果的新方式
  2. DwmEnableBlurBehindWindow
    1. 这个 API 最初旨在为窗口启用类似 Windows Aero 的毛玻璃模糊背景效果
    2. 但从 Windows 8 开始,它常被用来实现简单的背景透明或半透明效果

无重定向表面窗口

  1. 概述
    1. 这是 Windows 8 及以上系统支持的高性能方案,被 WPFWinUI 等现代 UI 框架广泛采用
  2. 核心是在创建窗口时使用WS_EX_NOREDIRECTIONBITMAP扩展样式
    1. 这个样式告诉系统不要为该窗口创建默认的离屏重定向表面
    2. 没有了这个表面,DWM 就不知道如何合成窗口内容,因此需要开发者自己利用 DirectX(如 Direct3D 11)和 DirectComposition API 来创建交换链(Swap Chain),并将渲染好的图像内容(通常是带有 Alpha 通道的纹理)通过一个"Visual"树提交给 DWM 进行最终合成

如何自己实现多态

概述

  1. 关键在于,我们将手动管理一个函数指针表来替代编译器生成的虚函数表

实现

关键点

  1. 函数指针管理:
    1. 我们使用 std::unordered_map来模拟虚函数表,将函数名(如 "draw")映射到具体的静态成员函数地址
    2. 这种字符串查找的方式虽然比C++原生的直接偏移访问要慢,但更直观
  2. 对象身份传递:
    1. 每个静态成员函数(如 Circle::draw_impl)都接受一个 void* this_ptr参数,它实际上指向调用该函数的对象(CircleRectangle实例)
    2. 在函数内部,需要将 void*转换回正确的类型[CITATION]
  3. “重写”机制:
    1. 派生类的构造函数会“重写”从基类继承来的vtable,将其中的函数指针替换为自己实现的函数地址,从而实现多态行为[CITATION]

自己实现vector

概述

  1. 核心在于模拟一个动态数组,并自动处理其生命周期的各个环节

实现

关键点

  1. 内存管理与布局
    1. 使用三个指针(_start, _finish, _end_of_storage)分别指向内存起始点、最后一个元素的下一个位置、已分配内存的末尾
    2. 通过指针差值计算 size()capacity()
  2. 构造与析构
    1. 实现多种构造函数(默认、数量-值、迭代器范围、拷贝构造等),注意初始化列表
    2. 析构函数必须正确释放内存
  3. 核心操作:push_back/ insert/ erase
    1. 动态扩容是重点,通常采用成倍增长策略(如原容量为0时扩至4,否则扩至2倍)
    2. 在中间位置inserterase元素需要移动后续所有元素
  4. 深浅拷贝问题
    1. 拷贝构造函数和赋值运算符重载必须实现深拷贝
    2. 避免使用memcpy等浅拷贝方式,应为每个元素调用其拷贝构造函数或赋值运算符
  5. 迭代器失效
    1. 任何可能引起内存重新分配(如insertpush_back导致扩容)或元素移动(如erase)的操作都会使指向该内存区的迭代器、指针和引用失效
  6. 元素访问
    1. 重载 operator[]以实现数组式访问。可考虑添加边界检查
    2. 提供 begin()end()函数以支持范围循环

其他

  1. vector
  2. 进程间通信
  3. vector删掉元素,背后的内存变化
  4. std::move
  5. vector迭代器失效问题
  6. 带权图的最短路径问题

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

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2025-11-11
Everything will be better.

发表评论

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