Вот код из переключателя в функции WndProc Я был дан в качестве примера:Почему мне нужно сохранять дескриптор старого растрового изображения при рисовании с помощью Win32 GDI?
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;
Мой вопрос, почему это необходимо для сохранения и восстановления возвращаемого значения SelectObject() в oldBM?
Хуже утечки ресурса растрового изображения является двойное удаление: если вы играете по правилам и удаляете свой растровый ресурс (который все еще выбран в контексте устройства), система будет делать то же самое, когда 'WM_PAINT 'обработчик возвращается. – IInspectable