MFC 中 `CRgn` 封裝了 Windows GDI 區域物件,支援矩形、橢圓、多邊形等任意形狀。區域不直接選入 DC,但可用於點擊測試、區域合併、裁剪輸出等操作。善用裁剪區域可大幅提升重繪效率——僅重繪失效區域而非整個視窗。
| 函數 | 用途 |
|---|---|
| CreateRectRgn | 由矩形建立區域 |
| CreateEllipticRgn | 由橢圓建立區域 |
| CreatePolygonRgn | 由多點構成多邊形區域 |
| PtInRegion | 測試點是否在區域內 |
| CombineRgn | 合併兩區域(聯集、交集、差集、XOR) |
| EqualRgn | 比較兩區域是否相等 |
| GetRgnBox | 取得包含區域的最小外接矩形 |
當視窗部分區域失效(如被遮擋視窗移動),Windows 標記該區域為「更新區域」。呼叫 `CDC::GetClipBox(LPRECT)` 可取得包含更新區域的最小矩形,繪圖時僅處理此矩形範圍即可。
void CMyView::OnDraw(CDC* pDC) {
CRect clipBox;
pDC->GetClipBox(&clipBox); // 取得需重繪的邊界矩形
// 僅在 clipBox 範圍內進行繪圖運算與輸出
// ...
}
若需精確區域,可用 `::GetClipRgn(hdc, hrgn)` 取得真實區域句柄,但通常矩形近似已足夠且效能更好。