2015-05-26 4 views
2

Вот код из переключателя в функции 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?

ответ

3

Почему необходимо сохранить и восстановить возвращаемое значение SelectObject() в oldBM?

BeginPaint() дает вам HDC, который уже имеет значение по умолчанию HBITMAP выбранного в него. Затем вы заменяете это своим собственным HBITMAP. Вы не выделили оригинал HBITMAP и не владеете им, BeginPaint() выделил его. Вы должны восстановить оригинал HBITMAP, когда вы закончите, используя HDC, чтобы EndPaint() мог освободить его при уничтожении HDC, иначе он будет просочиться.

+0

Хуже утечки ресурса растрового изображения является двойное удаление: если вы играете по правилам и удаляете свой растровый ресурс (который все еще выбран в контексте устройства), система будет делать то же самое, когда 'WM_PAINT 'обработчик возвращается. – IInspectable