Visual Studio 2019 C++中OffsetRgn无法偏移区域问题求助
解决OffsetRgn调用后区域未生效的问题
嘿,刚看完你的代码,问题其实很容易定位~你现在看不到偏移效果的核心原因是:你先把原始椭圆区域画到了屏幕上,之后才调用OffsetRgn偏移内存里的区域,但偏移后的区域并没有重新绘制出来。
OffsetRgn这个函数只是修改了CRgn对象在内存中的坐标信息,并不会自动把修改后的区域同步到屏幕上。所以你之前的操作相当于:先画了个红色椭圆,然后在内存里把这个椭圆的坐标改了,但没把新坐标的椭圆再画一遍,自然看不到偏移后的效果啦。
解决方案1:先偏移再绘制
如果只需要显示偏移后的椭圆,调整代码顺序,先执行偏移操作,再调用FillRgn绘制:
void CBallBounceView::OnDraw(CDC* pDC) { CBallBounceDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CString str; str.Format(_T("Counter = %d"), counter); CRgn rgnA; VERIFY(rgnA.CreateEllipticRgn(50, 50, 150, 150)); // 先执行区域偏移 int nOffsetResult = rgnA.OffsetRgn(500, 100); ASSERT(nOffsetResult != ERROR && nOffsetResult != NULLREGION); // 再绘制偏移后的区域 CBrush brA; VERIFY(brA.CreateSolidBrush(RGB(255, 0, 0))); VERIFY(pDC->FillRgn(&rgnA, &brA)); }
解决方案2:同时显示原区域和偏移后的区域
如果你想同时看到原始椭圆和偏移后的椭圆,可以利用你已经定义但没用到的copyeed(建议改成copiedRgn更易读)来复制原始区域,分别绘制两个区域:
void CBallBounceView::OnDraw(CDC* pDC) { CBallBounceDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CString str; str.Format(_T("Counter = %d"), counter); CRgn rgnA, copiedRgn; VERIFY(rgnA.CreateEllipticRgn(50, 50, 150, 150)); // 复制原始区域到新的CRgn对象 VERIFY(copiedRgn.CopyRgn(&rgnA)); // 偏移复制后的区域 int nOffsetResult = copiedRgn.OffsetRgn(500, 100); ASSERT(nOffsetResult != ERROR && nOffsetResult != NULLREGION); // 绘制原始红色椭圆 CBrush brRed; VERIFY(brRed.CreateSolidBrush(RGB(255, 0, 0))); VERIFY(pDC->FillRgn(&rgnA, &brRed)); // 绘制偏移后的蓝色椭圆(用不同颜色区分) CBrush brBlue; VERIFY(brBlue.CreateSolidBrush(RGB(0, 0, 255))); VERIFY(pDC->FillRgn(&copiedRgn, &brBlue)); }
额外说明
记住,CRgn类的大部分操作都是针对内存中的区域数据,和屏幕显示是分离的。不管你对CRgn做了什么修改,都需要调用CDC的绘制函数(比如FillRgn、FrameRgn),才能把修改后的区域渲染到屏幕上。
内容的提问来源于stack exchange,提问作者Arun K
相关产品推荐
相关产品推荐

