【问题标题】:correct usage of GetClipRgn?GetClipRgn 的正确用法?
【发布时间】:2010-08-13 15:09:01
【问题描述】:

我想编写一个函数,需要在 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 );
    }
}

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

这是正确的用法吗?

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

【问题讨论】:

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

标签: c++ winapi


【解决方案1】:

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

是的,这是一个奇怪的功能。您的代码看起来不错。

【讨论】:

    【解决方案2】:

    我使用SaveDCRestoreDC 函数:

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

    感觉更干净了。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-10
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-01
        • 2012-03-08
        • 2011-07-25
        相关资源
        最近更新 更多