首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Win32 GDI+ 自繪按鈕與漸變標題欄實現:從零構建自定義窗口外觀

     編輯:關於C語言

Win32 GDI+ 自繪按鈕與漸變標題欄實現:從零構建自定義窗口外觀

Win32 原生 API 無法直接修改標題欄顏色,解決方案:移除系統標題欄(WS_POPUP),在客戶區自繪標題欄與按鈕(最小化、關閉),使用 GDI+ 實現漸變填充與多邊形繪製。

核心技術點

  1. GDI+ 初始化:GdiplusStartup / GdiplusShutdown,命名空間 Gdiplus。
  2. 自繪按鈕:建立按鈕時指定 BS_OWNERDRAW,處理 WM_DRAWITEM 消息,使用 Graphics、LinearGradientBrush、FillPolygon 繪製漸變背景與三角形圖標。
  3. 漸變標題欄:WM_PAINT 中用 LinearGradientBrush 多色停靠點填充矩形區域。
  4. 窗口拖移: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;
}

待解決問題

  1. 按鈕背景透明:目前用同色漸變模擬,真正透明需處理 WM_ERASEBKGND 並使用 WS_EX_TRANSPARENT 或 Alpha 混合。
  2. 系統選單漸變:需 Hook 系統繪製或使用 DWM API(DwmExtendFrameIntoClientArea)實現玻璃/漸變效果。

效果圖

目標效果:漸變標題欄 實現效果:自繪標題欄與按鈕 按鈕漸變色計算示意

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved