2015-01-14 7 views
0

Итак, мой учитель дал нам кусок кода для двойной буферизации.hdc undefined [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' уже будет доступен (предположительно это DC окна, которое вы пытаетесь нарисовать). Должен быть какой-то другой текст, объясняющий это. Если нет, вы можете попробовать функцию [GetDC] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd144871%28v=vs.85%29.aspx). –

+1

Не используйте 'BeginPaint', если вы не находитесь в обработчике сообщения' WM_PAINT'. –

ответ

0

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

0

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

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

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