背景
windows做繪制時,為了美觀,常常將一些圖片或者窗口的四個角做成圓角。例如QQ窗口:
圓角的實現方案總結
- 其實總結起來非常的簡單,就兩個步驟:
- 計算窗口的邊界剪切域
- 通過windows API
SetWindowRgn
設置該窗口的剪切域
- 其實原理就是,設置好邊界剪切域之后,windows會將邊界剪切域中的像素都去掉。
步驟詳解
1. 計算窗口的邊界剪切域
- MFC中可利用
CRgn
類 - 使用
CreateRectRgn
創建邊界剪切域- 可用
CreateRoundRectRgn
創建圓角矩形區域 CreateEllipticRgn
創建橢圓形剪切域CreatePolygonRgn
創建多邊形剪切域
- 可用
- 使用
CombineRgn
來修改邊界剪切域,常用的位操作如下:RGN_AND
RGN_OR
RGN_XOR
RGN_DIFF
RGN_COPY
2. 設置窗口的邊界剪切域
-
使用
SetWindowRgn
API設置窗口的剪切域- 需傳入參數:邊界剪切域的句柄
HRGN
- 需傳入參數:是否觸發重繪
- 需傳入參數:邊界剪切域的句柄
-
上述兩步驟,可以簡單的理解為:
- 給windows窗口設置要被“剪掉”的區域
- 以后windows系統域每次重繪的時候,都會把這部分區域“剪掉”,這樣就實現了圓角或者其他豐富形狀的窗口