使用 Direct2D 在非客户区绘图

Posted

技术标签:

【中文标题】使用 Direct2D 在非客户区绘图【英文标题】:Draw in the nonclient area with Direct2D 【发布时间】:2020-02-24 14:12:50 【问题描述】:

在此页面上:https://docs.microsoft.com/en-us/windows/win32/gdi/wm-ncpaint 解释了如何使用 GDI 在非客户区进行绘制。

如何使用 Direct2D 在我的窗口的非客户区绘制而无需处理 GDI 或 GDI+?

【问题讨论】:

你尝试过基于 HDC 的目标吗? 见Custom Window Frame Using DWM。 谢谢,但我不明白如何像 Firefox 或 Microsoft Office 那样在框架中绘图... 【参考方案1】:

首先,WM_NCPAINT 是旧的。使用它将禁用窗口的 DWM 主题,从而提供 windows 经典/7 基本外观。所以不要这样做。

但要使用任何渲染 API 来在客户区绘制,请在 WM_NCCALCSIZE 消息中的 wParam 为 true 时通过返回 0 从窗口中移除标准窗口框架。

case WM_NCCALCSIZE:
    if (static_cast<bool>(wParam))
           return 0;
    return DefWindowProc(hwnd, msg, wParam, lParam);

如果要保留标准边框,请重新计算WM_NCCALCSIZE 中的窗口边界。

然后要获得“客户区”标题栏,请使用DwmExtendFrameIntoClientArea 并从TOP 扩展它。

确保处理WM_NCHITTEST,以便拖动窗口也可以工作。

确保在 direct2d 中预乘您的 ALPHA。 在 (0,0) 处绘制一个矩形将在新自定义窗口的标题栏中绘制一个矩形。

查看:https://github.com/oberth/custom-chrome

【讨论】:

以上是关于使用 Direct2D 在非客户区绘图的主要内容,如果未能解决你的问题,请参考以下文章

关于 Direct2D 绘图调用中的多线程

Direct2D 设备中的 C++ 绘图弧

Direct2D 第6篇 绘制多种风格的线条

Direct2D开发:向 MFC 项目添加 Direct2D 对象

GDI InvertRect 的 Direct2D 等效项

非客户区