Win32 原生 API 無法直接修改標題欄顏色,解決方案:移除系統標題欄(WS_POPUP),在客戶區自繪標題欄與按鈕(最小化、關閉),使用 GDI+ 實現漸變填充與多邊形繪製。
GdiplusStartup / GdiplusShutdown,命名空間 Gdiplus。BS_OWNERDRAW,處理 WM_DRAWITEM 消息,使用 Graphics、LinearGradientBrush、FillPolygon 繪製漸變背景與三角形圖標。WM_PAINT 中用 LinearGradientBrush 多色停靠點填充矩形區域。WM_LBUTTONDOWN 發送 WM_NCLBUTTONDOWN 模擬點擊標題欄。// GDI+ 漸變填充輔助
void FillRect(HDC hdc, Rect r, Color *cols, float *pos, int cnt) {
Graphics g(hdc);
LinearGradientBrush brush(r, Color(255,255,255,0), Color(255,255,0,0), LinearGradientModeVertical);
brush.SetInterpolationColors(cols, pos, cnt);
g.FillRectangle(&brush, r);
}
// WM_DRAWITEM 繪製按鈕
case WM_DRAWITEM: {
LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam;
Graphics g(dis->hDC);
Rect r(0,0,40,30);
Color cols[] = { Color(247,247,247), Color(231,235,139), Color(214,223,231) };
float pos[] = { 0.0f, 0.5f, 1.0f };
FillRect(dis->hDC, r, cols, pos, 3);
// 繪製三角形圖標...
if (dis->itemState & ODS_FOCUS) DrawFocusRect(dis->hDC, &dis->rcItem);
return 0;
}
WM_ERASEBKGND 並使用 WS_EX_TRANSPARENT 或 Alpha 混合。DwmExtendFrameIntoClientArea)實現玻璃/漸變效果。
