在 Vsual Studio 中C++偏移Rgn 不起作用>


void CBallBounceView::OnDraw(CDC* pDC)
{
CBallBounceDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CString str; 
str.Format(_T("Counter = %d"), counter);
CRgn   rgnA,copyeed;
VERIFY(rgnA.CreateEllipticRgn(50, 50, 150, 150));
CBrush brA;
VERIFY(brA.CreateSolidBrush(RGB(255, 0, 0)));
VERIFY(pDC->FillRgn(&rgnA, &brA));      // rgnA Red Filled
int nOffsetResult = rgnA.OffsetRgn(500, 100);
ASSERT(nOffsetResult != ERROR && nOffsetResult != NULLREGION);

}

我试图偏移椭圆区域,但它没有偏移。我是visual studio C++的新手;我正在使用Visual studio 2019。

问题是,一旦输出被呈现到给定的设备上下文(如pDC->FillRgn(&rgnA, &brA)调用(,对该区域的任何后续更改都不会更改显示的输出。

为了做到这一点,您需要执行一个操作循环:

  1. 在对象的原始位置绘制对象
  2. 然后,当移动时,擦除原始对象;而且
  3. 在新位置绘制对象
  4. 每次移动对象时重复此操作

通常通过每次在目标设备上下文上使用XOR(独占或("混合模式"绘制对象来执行"擦除"操作。因此,第一次绘制时,它将在背景上绘制对象,而第二次绘制时将恢复背景。您可以使用CDC::SetROP2(R2_XORPEN)函数来设置该模式。

这是一个"邋遢"(但可运行(的程序,演示了XOR绘图技术的使用。它使用"原始"Windows GDI调用(而不是MFC(,是一个控制台模式程序,但它有望展示该技术的基本原理:

#include <Windows.h>
#define BLOBSIZE 20
#define MOVESTEP  5
int main()
{
SetProcessDPIAware(); // Comment this line out if using 'older' versions of Windows.
HWND hWnd = GetConsoleWindow();
HDC hDC = GetDC(hWnd);
RECT rc; GetClientRect(hWnd, &rc);
int x = 50, y = 30;
int dx = MOVESTEP, dy = MOVESTEP;
SetROP2(hDC, R2_XORPEN);
SelectObject(hDC, GetStockObject(WHITE_BRUSH));
SelectObject(hDC, GetStockObject(NULL_PEN));
do {
Ellipse(hDC, x, y, x + BLOBSIZE, y + BLOBSIZE); // First call: Draws the object
Sleep(10); // Here, we just wait, but you can do whatever else you want between moves
Ellipse(hDC, x, y, x + BLOBSIZE, y + BLOBSIZE); // Second call: erase it
x += dx;
if ((dx > 0 && x >= rc.right - BLOBSIZE) || (dx < 0 && x == 0)) {
Beep(1000, 10);
dx *= -1;
}
y += dy;
if ((dy > 0 && y >= rc.bottom - BLOBSIZE) || (dy < 0 && y == 0)) {
Beep(1000, 10);
dy *= -1;
}
} while (!(GetAsyncKeyState(VK_SPACE) & 0x8000)); // Press spacebar to quit!
ReleaseDC(hWnd, hDC);
return 0;
}

最新更新