You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:37:40