【发布时间】:2019-07-03 04:34:58
【问题描述】:
我正在使用 Embarcadero RAD Studio C++ builder XE7。
对于使用 Windows GDI 的绘图功能,我需要将剪辑区域添加到画布的设备上下文中。
通过测试我的代码,我注意到有时剪辑区域小于预期大小。我搜索了原因,发现 OffsetRgn() 函数有一个奇怪的行为,这让我有点困惑。
要应用剪辑区域,我使用类似于以下的代码:
std::unique_ptr<TBitmap> pBitmap(new TBitmap());
pBitmap->PixelFormat = pf32bit;
pBitmap->AlphaFormat = afDefined;
pBitmap->SetSize(60, 7);
TCanvas* pCanvas = pBitmap->Canvas;
::SelectClipRgn(pCanvas->Handle, NULL);
const TRect sourceRect = pCanvas->ClipRect;
HRGN pClipRegion = ::CreateRectRgn(50, -2, 60, 8);
::SelectClipRgn(pCanvas->Handle, pClipRegion);
const TRect intermediateRect = pCanvas->ClipRect;
const int deltaX = pCanvas->ClipRect.Left - 50;
const int deltaY = pCanvas->ClipRect.Top - (-2);
::OffsetRgn(pClipRegion, -deltaX, -deltaY);
::SelectClipRgn(pCanvas->Handle, pClipRegion);
const TRect finalRect = pCanvas->ClipRect;
NOTE 写成这样并且脱离了他的上下文,上面的代码并没有真正的意义,我知道这是不合逻辑的。请不要评判它的质量,这不是我提问的目的。我收集了几段摘录,并将它们组合成一个可执行代码来提出问题。
硬编码值是问题发生时我在应用程序中获得的值的一个示例。如果我执行上面的代码,我测量:
- sourceRect 值中的左 = 0,上 = 0,右 = 60,下 = 7
- left = 50,top = 0,right = 60,bottom = 7 in intermediateRect 值
- left = 50, top = 0, right = 60, bottom = 6 in finalRect
然而,我希望 finalRect 中的底部值也应该等于 7,这是画布限制,因为我只移动了该区域而没有其他任何内容。那么为什么它的价值突然变得比预期的要小呢?
【问题讨论】:
标签: gdi region clip rad-studio