Так что мой учитель дал нам кусок кода для двойной буферизации.
Он сказал: «Вот, используйте этот код, чтобы вам не пришлось часами искать, как» За исключением того, что его код не работает.
Его первоначальное использование HDC не определено. Я попытался поместить его в список параметров, но это не пойдет.
Вот код, который он дал нам:
// Create a backbufer bmp bufer to draw to in memory.
RECT rcClient;
::GetClientRect(hwnd, &rcClient);
int left = rcClient.left;
int top = rcClient.top;
int width = rcClient.right - rcClient.left;
int height = rcClient.bottom - rcClient.top;
HDC hdcMem = ::CreateCompatibleDC(hdc);
const int nMemDC = ::SaveDC(hdcMem);
HBITMAP hBitmap = ::CreateCompatibleBitmap(hdc, width, height);
::SelectObject(hdcMem, hBitmap);
Graphics graphics(hdcMem);
SolidBrush back(Color(255,255,255));
graphics.FillRectangle(&back, left, top, width, height);
// Draw to backbufer bitmap here.
// End draw to backbufer bitmap bufer.
// Swap bufers ie. push memory backbufer to the screen frontbufer
RECT rcClip;
::GetClipBox(hdc, &rcClip);
left = rcClip.left;
top = rcClip.top;
width = rcClip.right - rcClip.left;
height = rcClip.bottom - rcClip.top;
::BitBlt(hdc, left, top, width, height, hdcMem, left, top, SRCCOPY);
::RestoreDC(hdcMem, nMemDC);
::DeleteObject(hBitmap);
Именно здесь я сталкиваюсь с ошибками: HDC hdcMem = ::CreateCompatibleDC(hdc);
Я попытался объявить HDC как
HDC hdc = (HDC)BeginPaint((LPPAINTSTRUCT)AfxGetApp()->m_pMainWnd->GetSafeHwnd());
Но это не компилируется. Что мне делать с этим HDC?
HDC возвращается BeginPaint, который предположительно вызывается непосредственно перед этим кодом. BeginPaint принимает два параметра, и вы пытаетесь вызвать его только с одним параметром. Есть ли у вас ранее упражнения, где вы работали с BeginPaint?
Так что благодаря различным ответам здесь. Мои знания об этом все еще довольно новы, однако с помощью моих одноклассников я смог найти решение. К сожалению, я до сих пор не знаю, что делать с HDC, и это было первой из моих проблем,
HDC hdcMem = ::CreateCompatibleDC(hdc); was able to be replaced by
HDC hdcMem = ::CreateCompatibleDC(dc);
и большая часть другого кода, который выдавал предупреждения, такие как hwnd, была просто удалена, и она работала нормально.