C++ GetClipRgn的正确用法?

C++ GetClipRgn的正确用法?,c++,winapi,C++,Winapi,我想写一个函数,需要在DC上设置剪裁区域,但在完成后恢复DC上的任何现有剪裁区域 所以我发现,这听起来正是我想要的,但似乎令人困惑。我找不到任何使用它的例子,Petzold也没有提供任何东西 我想到的是: void DrawStuff( HDC hDC ) { HRGN restoreRegion = CreateRectRgn( 0, 0, 0, 0 ); if (GetClipRgn( hDC, restoreRegion ) != 1) { Dele

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

所以我发现,这听起来正是我想要的,但似乎令人困惑。我找不到任何使用它的例子,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 );
    }
}
为了得到当前区域,我需要创建一个区域,这看起来很奇怪

这是正确的用法吗


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

int-SelectClipRgn(\uu在HDC-HDC中,\uu在HRGN-HRGN中)做这个工作

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

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

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


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

最接近正确答案的是Hans Passant的注释:

是的,这是一个奇怪的函数。你的代码看起来不错

我使用以下命令和功能:

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


感觉更干净。

您真的需要一个“小”区域(通常称为“感兴趣区域-ROI”)作为整个客户端区域的一个子部分吗?GetClientRect()将为您提供完整的可绘制区域。剪辑区域用于获取该区域的一部分。是的,这是一个奇怪的函数。您的代码看起来不错。@Hans-谢谢,我现在感觉好多了。可能是我使用过的最奇怪的win32函数。。。