使用 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://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.