我正在编写一个应用程序,作为其中的一部分,它在罗技G15v2键盘的液晶显示器上绘制一幅图像。在大多数情况下,该函数工作良好,但运行一段时间后,其中一行将抛出一个"Generic Error in GDI+“。
根据堆栈跟踪,问题出现在Bitmap.GetHbitmap()中。
at System.Drawing.Bitmap.GetHbitmap(Color background)
at System.Drawing.Bitmap.GetHbitmap()
at CSCI171_TermProject.G15.Tick(Single Interval) in C:\Users\Sukasa\CSCI171\Term Project\CSCI171-TermProject\G15.vb:line 45"我读过一些提到此错误的线程,但这是在保存文件的上下文中,而不是在获取其关联的HBitmap的上下文中。谁比我有更多的GDI+经验,能够提供任何想法,是什么原因造成这个问题?
为了获得更好的参考,下面是完整的代码模块:
Public Module G15
Private G15 As New G15Lib.G15Interface
Private G15BaseImage As New Bitmap("GFX\G15-BGImg.png")
Private G15Minimap As New Bitmap(43, 43, Imaging.PixelFormat.Format32bppArgb)
Private G15HeartMonitor As New Bitmap(44, 17, Imaging.PixelFormat.Format32bppArgb)
Private G15Heartbeat As New Bitmap("GFX\G15-HB.png")
Private G As Graphics = Graphics.FromImage(G15BaseImage)
Private G15On As Boolean = False
Public Sub Init()
If Not G15.G15Detected Then
Log.Write("Get extra content by connecting a G15")
Return
End If
G15On = True
G15.LCD.initLCD(AppName)
G15.LEDs.setKeyboardLight(2)
G15.LCD.showBitmap(G15BaseImage.GetHbitmap, 1)
Log.Write("Logitech G15 Features Enabled")
End Sub
Public Sub Tick(ByVal Interval As Single)
Const StepTime As Single = 0.09
If Not G15On Then Return
Static HeartTime As Single = StepTime
HeartTime -= Interval
If HeartTime <= 0 Then
HeartTime = StepTime
AnimateHeartbeat()
End If
MakeMinimap()
G.DrawImage(G15Minimap, New Rectangle(0, 0, 43, 43), New Rectangle(0, 0, 43, 43), GraphicsUnit.Pixel)
G.DrawImage(G15HeartMonitor, New Rectangle(116, 0, 44, 17), New Rectangle(0, 0, 44, 17), GraphicsUnit.Pixel)
Try
G15.LCD.showBitmap(G15BaseImage.GetHbitmap, 1)
Catch ex As Exception
G15On = False
G15.LCD.closeLCD()
Log.Write("GDI+ Error in G15 renderer")
Log.Write("G15 features disabled")
End Try
End Sub
Public Sub AnimateHeartbeat()
Static G As Graphics = Graphics.FromImage(G15HeartMonitor)
Static BMTemp As New Bitmap(44, 17, Imaging.PixelFormat.Format32bppArgb)
Static GTemp As Graphics = Graphics.FromImage(BMTemp)
Dim Columns As Integer = 13 + ((PlayerActor.HPMax - PlayerActor.iHP) / PlayerActor.HPMax) * 20
Static ColumnIndex As Integer = 0
GTemp.DrawImage(G15HeartMonitor, New Rectangle(0, 0, 44, 17), New Rectangle(1, 0, 44, 17), GraphicsUnit.Pixel)
G.DrawImage(BMTemp, New Rectangle(0, 0, 44, 17), New Rectangle(0, 0, 44, 17), GraphicsUnit.Pixel)
G.DrawLine(Pens.Black, 43, 0, 43, 17)
If ColumnIndex >= Columns Then
ColumnIndex = 0
End If
G.DrawImage(G15Heartbeat, New Rectangle(43, 4, 1, 8), New Rectangle(If(PlayerActor.iHP > 0, Math.Min(ColumnIndex, 7), 7), 0, 1, 8), GraphicsUnit.Pixel)
ColumnIndex += 1
End Sub
Public Sub MakeMinimap()
Static oPos As New XYPos(0, 0)
Dim iActorIndice As Int32 = 0
For Y = -21 To 21
For X = -21 To 21
G15Minimap.SetPixel(X + 21, Y + 21, Color.Black)
oPos.X = X + PlayerActor.PositionX
oPos.Y = Y + PlayerActor.PositionY
If oPos.Y < 0 OrElse oPos.X < 0 OrElse oPos.X >= iMapSize OrElse oPos.Y >= iMapSize Then
G15Minimap.SetPixel(X + 21, Y + 21, Color.Black)
Continue For
End If
If Main.Map.arrAccessiblityMap(oPos.AsOffset) Then
G15Minimap.SetPixel(X + 21, Y + 21, Color.White)
Else
G15Minimap.SetPixel(X + 21, Y + 21, Color.Black)
End If
For iActorIndice = iActorIndice To genActors.Count - 1
Dim oActor As Actor = genActors(iActorIndice)
If oPos.Y > oActor.PositionY Then
Continue For
ElseIf oPos.Y < oActor.PositionY Then
Exit For
ElseIf oPos.Y = oActor.PositionY AndAlso oPos.X < oActor.PositionX Then
Exit For
End If
If oPos.X = oActor.PositionX AndAlso oPos.Y = oActor.PositionY Then
G15Minimap.SetPixel(X + 21, Y + 21, Color.Black)
End If
Next
Next
Next
End Sub
End Module发布于 2010-02-18 12:50:25
我首先要确保在Graphics和Bitmap对象上正确地调用.Dispose()。(我不明白所有这些“静力学”的目的-但那是另一个故事)。
发布于 2019-09-16 12:30:25
调用GetHbitmap()之后,需要调用DeleteObject()
http://pinvoke.net/default.aspx/gdi32/DeleteObject.html
https://stackoverflow.com/questions/2286722
复制相似问题