【发布时间】:2015-03-12 03:32:54
【问题描述】:
所以我的老师给了我们一段代码用于双缓冲。
他说:“在这里,使用此代码,这样您就不必坐在那里数小时了解如何操作” 除了他的代码不起作用。
他最初对 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已经可用(可能是您尝试绘制的窗口的DC)。应该有一些其他的文本来解释这一点。如果没有,那么您可以尝试GetDC 函数。 -
不要使用
BeginPaint,除非你在WM_PAINT消息的处理程序中。