背景
windows做繪制時,為了美觀,常常將一些圖片或者窗口的四個角做成圓角。例如QQ窗口:

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