我想编写一个函数,需要在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 );
}
}
我需要创建一个区域才能获得当前区域,这似乎很奇怪。
这是正确的用法吗?
有没有更好的方法来达到同样的效果?
答案 0 :(得分:4)
最接近正确答案的是Hans Passant的评论:
是的,这是一个奇怪的功能。你的代码看起来没问题。
答案 1 :(得分:4)
SaveDC 功能可保存指定设备的当前状态 上下文(DC)通过复制描述所选对象和图形的数据 模式(如位图,画笔,调色板,字体,笔,区域,绘图 模式和映射模式)到上下文堆栈。
感觉更干净。
答案 2 :(得分:1)
int SelectClipRgn( __in HDC hdc, __in HRGN hrgn);
会完成这项工作吗?
SelectClipRgn函数选择一个区域作为指定设备上下文的当前剪切区域。
仅使用所选区域的副本。可以为任意数量的其他设备上下文选择区域本身,也可以将其删除。
SelectClipRgn函数假定区域的坐标以设备单位指定。
要删除设备上下文的剪辑区域,请指定NULL区域句柄。