使用 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 在非客户区绘图的主要内容,如果未能解决你的问题,请参考以下文章