Word 按 F1 彈出的非矩形說明視窗令人印象深刻。實作這類視窗其實相當簡單,關鍵在於掌握 Windows Region 機制與核心 API。
CreateRectRgn:矩形CreateRoundRectRgn:圓角矩形CreateEllipticRgn:圓形/橢圓CreatePolygonRgn:多邊形CombineRgn:合併多個 Region更靈活的方式是使用 BeginPath、EndPath、PathToRegion 三函式組合,讓開發者自由繪製任意路徑(直線、弧線、文字等)作為視窗輪廓。
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!");
}
同理,使用繪圖函式(MoveTo、LineTo、Arc 等)描繪 Word 說明視窗的複雜輪廓,再透過 PathToRegion 轉換。完整程式碼請參考本文配套源碼。

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