调用Bitmap.getHBitmap()时GDI +中的通用错误

编程入门 行业动态 更新时间:2024-10-27 11:19:38
本文介绍了调用Bitmap.getHBitmap()时GDI +中的通用错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在编写一个应用程序,该应用程序的一部分在Logitech G15v2键盘的LCD上绘制图像.在大多数情况下,该功能都可以正常运行,但是在运行一段时间后,其中一行会抛出"Generic Error in GDI+"

I'm writing an application which as part of it draws an image on a Logitech G15v2 keyboard's LCD. For the most part the function works fine, but after a while of running, one of the lines throws a "Generic Error in GDI+"

根据堆栈跟踪,问题出在Bitmap.GetHbitmap():

The problem, according to a stack trace, is in 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 +经验,就何为导致此问题的原因提供任何想法?

I've read a few threads mentioning this error, but that was in the context of saving a file, not getting its associated HBitmap. Would anyone with more experience with GDI+ than me be able to offer any ideas to what causes this problem?

为获得更好的参考,下面是完整的代码模块:

For better reference, here's the full code module:

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

推荐答案

我首先要确保在Graphics和Bitmap对象上正确调用.Dispose(). (我不了解所有这些静态对象的用途-但这是另一回事了.)

I'd start out by making sure that .Dispose() is correctly called on Graphics and Bitmap objects. (I don't understand the purpose of all those Statics' - but that's another story).

更多推荐

调用Bitmap.getHBitmap()时GDI +中的通用错误

本文发布于:2023-07-26 19:06:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1217920.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:错误   Bitmap   getHBitmap   GDI

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!