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

各式非矩形視窗實作技巧:從基本幾何到自訂路徑

     編輯:關於VC++

Word 按 F1 彈出的非矩形說明視窗令人印象深刻。實作這類視窗其實相當簡單,關鍵在於掌握 Windows Region 機制與核心 API。

建立 Region 的主要函式

  • CreateRectRgn:矩形
  • CreateRoundRectRgn:圓角矩形
  • CreateEllipticRgn:圓形/橢圓
  • CreatePolygonRgn:多邊形
  • CombineRgn:合併多個 Region

更靈活的方式是使用 BeginPath、EndPath、PathToRegion 三函式組合,讓開發者自由繪製任意路徑(直線、弧線、文字等)作為視窗輪廓。

改變視窗形狀:SetWindowRgn

SetWindowRgn(hRgn, TRUE);  // 單行完成視窗形狀變更

實作步驟:以文字視窗為例

按鈕 Click 事件中建立「VCKbase」文字形狀視窗:

CClientDC dc(this);
HDC hDC = ::GetDC(this->m_hWnd);
CFont mFont;
VERIFY(mFont.CreateFont(200, 50, 0, 0, FW_HEAVY, TRUE, FALSE, 0,
    ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
    DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋體"));

if (hDC != NULL) {
    dc.BeginPath();                    // 開始記錄路徑
    dc.SetBkMode(TRANSPARENT);         // 必須設定透明背景
    CFont* pOldFont = dc.SelectObject(&mFont);
    dc.TextOut(0, 0, "VCKbase");
    dc.SelectObject(pOldFont);
    mFont.DeleteObject();
    dc.EndPath();                      // 結束記錄路徑
    m_wndRgn = ::PathToRegion(dc);     // 路徑轉 Region
    this->SetWindowRgn(m_wndRgn, TRUE); // 套用視窗形狀
} else {
    AfxMessageBox("Error!");
}

Word 風格視窗實作

同理,使用繪圖函式(MoveTo、LineTo、Arc 等)描繪 Word 說明視窗的複雜輪廓,再透過 PathToRegion 轉換。完整程式碼請參考本文配套源碼。

總結

掌握 BeginPath/EndPath/PathToRegion 三部曲,配合 SetWindowRgn,即可輕鬆創建各式非矩形視窗。拿起畫筆,盡情發揮創意吧!

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