2010-08-13 241 views
6

我想編寫一個函數,需要在DC上設置剪切區域,但是在完成時還原DC上任何現有的剪切區域。正確使用GetClipRgn?

所以我發現GetClipRgn這聽起來像我想要的,但似乎令人困惑。我找不到任何使用它的例子,Petzold沒有提供。

我想出了是這樣的:

void DrawStuff(HDC hDC) 
{ 
    HRGN restoreRegion = CreateRectRgn(0, 0, 0, 0); 
    if (GetClipRgn(hDC, restoreRegion) != 1) 
    { 
     DeleteObject(restoreRegion); 
     restoreRegion = NULL; 
    } 

    // 
    // Set new region, do drawing 
    // 

    SelectClipRgn(hDC, restoreRegion); 
    if (restoreRegion != NULL) 
    { 
     DeleteObject(restoreRegion); 
    } 
} 

它只是似乎不可思議,我需要爲了得到當前區域創建一個區域。

這是正確的用法嗎?

是否有更好的方法來達到同樣的效果?

+0

您是否真的需要一個「小」區域(通常稱爲「感興趣區域 - 投資回報率」),它是整個客戶區的子部分?GetClientRect()將爲您提供完整的可繪製區域。獲取該區域的一部分 – JustBoo 2010-08-13 15:18:10

+5

是的,這是一個奇怪的功能,你的代碼看起來沒問題, – 2010-08-13 17:11:24

+1

@Hans - 謝謝我現在對它感覺更好,可能是我用過的最奇怪的win32函數... – markh44 2010-08-16 09:42:20

回答

3

井最接近正確答案是漢斯帕桑特的評論:

啊,這是一個奇怪的功能。你的代碼看起來沒問題。

1

請問int SelectClipRgn(__in HDC hdc, __in HRGN hrgn);能做這份工作嗎?

SelectClipRgn函數選擇一個區域作爲指定設備上下文的當前剪切區域。

只使用所選區域的副本。該區域本身可以被選擇用於任何數量的其他設備上下文,或者它可以被刪除。

SelectClipRgn函數假定區域的座標以設備單位指定。

要刪除設備上下文的剪輯區域,請指定一個NULL區域句柄。

4

我使用SaveDCRestoreDC功能:

SaveDC函數保存通過複製描述所選對象和圖形 模式數據指定的設備 上下文(DC)的當前狀態(例如作爲位圖,畫筆,調色板,字體,筆,區域,繪圖 模式和映射模式)到上下文堆棧。

它感覺更乾淨。