2014-07-11 110 views
1

我已經被要求調試一些代碼,試圖通過將屏幕截圖保存到BMP來嘗試在VB.Net中創建圖形的電影。我發現它擊中萬個GDI對象的限制後,它是失敗的,並確定泄漏是從這個代碼:GDI對象沒有刪除

Dim r As Integer 
Dim hdcdest As System.IntPtr = CType(CreateCompatibleDC(CInt(GetWindowDC(frmDynamicsMDI.MainControl.fraAnimation.Handle))), IntPtr) 
Dim hdcbitmap As System.IntPtr = CType(CreateCompatibleBitmap(GetWindowDC(frmDynamicsMDI.MainControl.fraAnimation.Handle), _ 
                  frmDynamicsMDI.MainControl.fraAnimation.Size.Width - (0 + CropRight), _ 
                  frmDynamicsMDI.MainControl.fraAnimation.Size.Height - (10 + 0)), IntPtr) 
SelectObject(hdcdest, CInt(hdcbitmap)) 
BitBlt(hdcdest, 0, 0, frmDynamicsMDI.MainControl.fraAnimation.Width - (0 + CropRight), frmDynamicsMDI.MainControl.fraAnimation.Height - (10 + 0), _ 
GetWindowDC(frmDynamicsMDI.MainControl.fraAnimation.Handle), 0, 10, 13369376) 

Image = System.Drawing.Image.FromHbitmap(hdcbitmap) 

r = DeleteDC(CInt(GetWindowDC(frmDynamicsMDI.MainControl.fraAnimation.Handle))) 


DeleteObject(CInt(hdcdest)) 
DeleteObject(CInt(hdcbitmap)) 

而且BitBlt的聲明爲:

Private Declare Function BitBlt Lib "GDI32" (ByVal hdestDC As IntPtr, ByVal x As Integer, ByVal y As Integer, _ 
     ByVal nwidth As Integer, ByVal nheight As Integer, ByVal HsrcDC As IntPtr, ByVal xsrc As Integer, ByVal ysrc As Integer, ByVal _ 
     dwRop As Int32) As Boolean 

的2個System.IntPtr建立呼叫創建2個GDI對象,'BitBlt'創建1個。我發現的問題是DeleteObject()調用每個都只移除1個GDI對象。

那麼刪除調用是不正確的?或者是否有其他對象與GDI對象一起浮動,這些對象不會被刪除?

+1

您的pinvoke聲明不好,從pinvoke.net網站上獲得更好的聲明。有很多泄漏,其中一個是由您的SelectObject()調用引起的。您必須存儲其返回值並在銷燬設備上下文之前再次調用SelectObject()以恢復原始選擇。你也忘記摧毀GetWindowDC()返回值。 –

回答

3

GetWindowDC function

GetWindowDC適用於窗口的非工作區中的特殊繪畫效果。不建議在任何窗口的非客戶區域進行繪畫。

繪畫完成後,必須調用ReleaseDC函數來釋放設備上下文。不釋放窗口設備上下文會嚴重影響應用程序請求的繪製。

您的代碼在多個位置調用GetWindowDC。嘗試將其僅調用一次到變量中,然後在完成後使用ReleaseDC。

+0

奇妙地工作!使用'Dim MainWindowDC As System.IntPtr = GetWindowDC(frmDynamicsMDI.MainControl.fraAnimation.Handle)',然後調用'DeleteDC(MainWindowDC)'成功清理資源 – user3565590

+0

@ user3565590不要忽略ReleaseDC,也不要忽略Hans的建議'關於SelectObject函數的評論。 – LarsTech

+0

ReleaseDC和DeleteDC有什麼不同?不刪除仍然釋放資源? – user3565590