hdc не определено [gdi +, стандартное приложение mfc]

Так что мой учитель дал нам кусок кода для двойной буферизации.

Он сказал: «Вот, используйте этот код, чтобы вам не пришлось часами искать, как» За исключением того, что его код не работает.

Его первоначальное использование 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?

0

Решение

HDC возвращается BeginPaint, который предположительно вызывается непосредственно перед этим кодом. BeginPaint принимает два параметра, и вы пытаетесь вызвать его только с одним параметром. Есть ли у вас ранее упражнения, где вы работали с BeginPaint?

0

Другие решения

Так что благодаря различным ответам здесь. Мои знания об этом все еще довольно новы, однако с помощью моих одноклассников я смог найти решение. К сожалению, я до сих пор не знаю, что делать с HDC, и это было первой из моих проблем,

 HDC hdcMem = ::CreateCompatibleDC(hdc); was able to be replaced by
HDC hdcMem = ::CreateCompatibleDC(dc);

и большая часть другого кода, который выдавал предупреждения, такие как hwnd, была просто удалена, и она работала нормально.

0

По вопросам рекламы [email protected]