在Graphics.Dispose之前或之后释放DC?

时间:2012-06-01 05:11:30

标签: .net vb.net winforms gdi+ device-context

在Windows窗体的背面,我得到一个窗口DC,用Graphics.FromHdc创建一个Graphics对象,然后在释放DC之前处理Graphics对象

Private Declare Function GetWindowDC Lib "user32.dll" (ByVal hwnd As IntPtr) As IntPtr
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As Integer

Dim hdc As IntPtr = GetWindowDC(Me.Handle)

Try
    Using g As Graphics = Graphics.FromHdc(hdc)
        ' ... use g ...
    End Using
Finally
    ReleaseDC(Me.Handle, hdc)
End Try

Graphics.FromHdc的Microsoft文档显示了类似的代码。 (它使用Graphics.GetHdcGraphics.ReleaseHdc,而不是Win32 GetWindowDcReleaseDC。)但是,他们在处置Graphics对象之前释放DC

' Get handle to device context.
Dim hdc As IntPtr = e.Graphics.GetHdc()

' Create new graphics object using handle to device context.
Dim newGraphics As Graphics = Graphics.FromHdc(hdc)

' Draw rectangle to screen.
newGraphics.DrawRectangle(New Pen(Color.Red, 3), 0, 0, 200, 100)

' Release handle to device context and dispose of the Graphics  ' object
e.Graphics.ReleaseHdc(hdc)
newGraphics.Dispose()

他们为什么这样做? DC应该在Graphics.Dispose之前还是之后发布? 错误的订单可能会导致资源泄漏或内存损坏吗?

1 个答案:

答案 0 :(得分:1)

从Graphics.Dispose方法:

private void Dispose(bool disposing)
{
..SNIP...
    if (this.nativeGraphics != IntPtr.Zero)
    {
        try
        {
            if (this.nativeHdc != IntPtr.Zero) <<---
            {
                this.ReleaseHdc(); <<--- 
    }

所以它似乎会自行释放hdc tbh。

[编辑]

实际上是:

[DllImport("gdiplus.dll", CharSet = CharSet.Unicode, EntryPoint = "GdipReleaseDC",     ExactSpelling = true, SetLastError = true)]
private static extern int IntGdipReleaseDC(HandleRef graphics, HandleRef hdc);

即将调用,不知道gdiplus版本dc是否也处理本机设备上下文