正确使用GetClipRgn?

时间:2010-08-13 15:09:02

标签: c++ winapi

我想编写一个函数,需要在DC上设置剪切区域,但在完成时恢复DC上的任何现有剪切区域。

所以我发现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 );
    }
}

我需要创建一个区域才能获得当前区域,这似乎很奇怪。

这是正确的用法吗?

有没有更好的方法来达到同样的效果?

3 个答案:

答案 0 :(得分:4)

最接近正确答案的是Hans Passant的评论:

  

是的,这是一个奇怪的功能。你的代码看起来没问题。

答案 1 :(得分:4)

我使用SaveDCRestoreDC函数:

  

SaveDC 功能可保存指定设备的当前状态   上下文(DC)通过复制描述所选对象和图形的数据   模式(如位图,画笔,调色板,字体,笔,区域,绘图   模式和映射模式)到上下文堆栈。

感觉更干净。

答案 2 :(得分:1)

int SelectClipRgn( __in HDC hdc, __in HRGN hrgn);会完成这项工作吗?

SelectClipRgn函数选择一个区域作为指定设备上下文的当前剪切区域。

仅使用所选区域的副本。可以为任意数量的其他设备上下文选择区域本身,也可以将其删除。

SelectClipRgn函数假定区域的坐标以设备单位指定。

要删除设备上下文的剪辑区域,请指定NULL区域句柄。