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

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

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

【问题讨论】:

  • 你尝试过基于 HDC 的目标吗?
  • 谢谢,但我不明白如何像 Firefox 或 Microsoft Office 那样在框架中绘图...

标签: c++ winapi gdi+ gdi direct2d


【解决方案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

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 2016-09-14
    • 2011-04-08
    • 2011-07-12
    • 1970-01-01
    • 2021-12-15
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多