这是我以WndProc函数中switch的代码为例:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// Create a system memory device context.
bmHDC = CreateCompatibleDC(hdc);
// Hook up the bitmap to the bmHDC.
oldBM = (HBITMAP)SelectObject(bmHDC, ghBitMap);
// Now copy the pixels from the bitmap bmHDC has selected
// to the pixels from the client area hdc has selected.
BitBlt(
hdc, // Destination DC.
0, // 'left' coordinate of destination rectangle.
0, // 'top' coordinate of destination rectangle.
bmWidth, // 'right' coordinate of destination rectangle.
bmHeight, // 'bottom' coordinate of destination rectangle.
bmHDC, // Bitmap source DC.
0, // 'left' coordinate of source rectangle.
0, // 'top' coordinate of source rectangle.
SRCCOPY); // Copy the source pixels directly
// to the destination pixels
// Select the originally loaded bitmap.
SelectObject(bmHDC, oldBM);
// Delete the system memory device context.
DeleteDC(bmHDC);
EndPaint(hWnd, &ps);
return 0;
我的问题是,为什么必须在oldBM中保存和恢复SelectObject()的返回值?
最佳答案
BeginPaint()
为您提供了已经选择了默认HDC
的HBITMAP
。然后,您将用自己的HBITMAP
替换它。您没有分配原始HBITMAP
,也不拥有它,而是BeginPaint()
分配了它。使用HBITMAP
完成操作后,必须还原原始的HDC
,以便EndPaint()
在销毁HDC
时可以将其释放,否则它将被泄漏。
关于c++ - 为什么在用Win32 GDI绘图时需要将句柄保存到旧的位图?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30451235/