使用 Direct2D 在非客户区绘制

Draw in the nonclient area with Direct2D

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

如何使用 Direct2D 在我的 window 的非客户区绘图,而不必处理 GDI 或 GDI+?

首先,WM_NCPAINT老了。使用它将禁用 window 的 DWM theme-ing,给出 windows classic/7 基本外观。所以不要这样做。

但是要使用任何渲染 API 在客户区进行绘制,当 wParam 在 WM_NCCALCSIZE 消息。

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

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

然后要获得 "client area" 标题栏,请使用 DwmExtendFrameIntoClientArea 并从 TOP.

扩展它

确保处理 WM_NCHITTEST 以便拖动 window 也能正常工作。

确保在 direct2d 中预乘 ALPHA。 在 (0,0) 处绘制一个矩形将在您的新自定义 window.

的标题栏中绘制一个矩形

参见:https://github.com/oberth/custom-chrome