2015-05-26 37 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; 

我的問題是,爲什麼有必要保存和恢復選擇對象的返回值()在oldBM?

回答

3

爲什麼需要保存和恢復oldBM中SelectObject()的返回值?

BeginPaint()爲您提供了一個已經選擇到它的默認HBITMAPHDC。然後你用自己的HBITMAP代替它。你沒有分配原始的HBITMAP而不擁有它,BeginPaint()分配它。當您使用HDC完成後,您必須恢復原始的HBITMAP,以便EndPaint()在銷燬HDC時可以釋放它,否則它將被泄漏。

+0

比泄漏位圖資源更糟糕的是雙重刪除:如果您按照規則進行遊戲,並將您的位圖資源(仍然選擇到設備上下文中)處理掉,則系統將執行相同的操作,當WM_PAINT '處理程序返回。 – IInspectable