2015-01-14 1 views
0

그래서 선생님이 더블 버퍼링에 사용할 코드 묶음을 주셨습니다.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)BeginPaint((LPPAINTSTRUCT)AfxGetApp()->m_pMainWnd->GetSafeHwnd()); 

같은 HDC를 선언 시도하지만하지 않습니다 엮다. 이 HDC로 무엇을합니까?

+0

이 코드는'hdc'가 이미 사용 가능할 것으로 기대하고 있습니다 (아마도 여러분이 그리려는 윈도우의 DC입니다). 이것을 설명하는 다른 텍스트가 있어야합니다. 그렇지 않다면 [GetDC] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd144871%28v=vs.85%29.aspx) 함수를 사용해보십시오. –

+1

'WM_PAINT' 메시지의 핸들러에 있지 않으면'BeginPaint'를 사용하지 마십시오. –

답변

0

HDC는이 코드 바로 전에 호출되는 BeginPaint에 의해 반환됩니다. BeginPaint는 두 개의 매개 변수를 사용하며 하나의 매개 변수로만 호출하려고합니다. BeginPaint를 다루는 이전 연습이 있습니까?

0

다양한 답변 덕분에. 이것에 대한 나의 지식은 여전히 ​​새롭지 만, 동료 학생들의 도움으로 해결책을 찾을 수있었습니다. 슬프게도 난 여전히 HDC 수행 할 작업을 모르는이는, 내 문제의 첫 번째

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

와 HWND 간단하게 제거가 잘 작동하고 같은 경고를 생성 한 다른 코드를 많이했다.

관련 문제