Hi,
ich habe ein Problem mit dem Handle einer Bitmap.
Die Bitmap soll zu einem Icon konvertiert werden.
Dazu rufe ich bmp.GetHicon auf und füttere System.Drawing.Icon.FromHandle damit.
(Vielleicht gibt es ja hier schon einen eleganteren Ansatz?)
Der Code funzt Prima und ist erstaunlich performant!
Mein Problem ist aber, das nach genau 3317 Durchgängen eine "allgemeine GDI+ Fehlermeldung" erscheint.
Was bisher geschah:
Da dieser Wert recht konstant war, dachte ich an diverse Überläufe und habe erstmal alles aus dieser Prozedur "Disposed".
Auch GC.Collect, Application.Doevents und ähnliche Verzweiflungstaten blieben wirkungslos.
Weiterhin habe ich den Timer langsamer gestellt, was das Problem nur verzögerte, nach 3317 durchläufen war es wieder da.
Das System rückt also das Handle nicht so oft raus?
OK, also Zeile 15 (iptr = bmp.GetHicon) ins Form-Load verschoben. Es stürzt nicht mehr ab, aber das Icon wird leider auch nicht mehr aktualisiert.
Also:
Wo mache ich den Denkfehler?
Verstehe ich bei den Handles was nicht?
Bisher dachte ich, das Handle auf die BMP (das ja global definiert ist) wäre immer das Gleiche und im Form-Load sollte ein einzelner Aufruf genügen um das Handle zu bekommen...
Ich habe den Code mal auf's Nötigste reduziert und abgespeckt um das Problem deutlich zu machen:
Public Class Form1
Dim NotifyIcon1 As New NotifyIcon
Dim bmp As New Bitmap(16, 16, _
System.Drawing.Imaging.PixelFormat.Format24bppRgb)
Dim iptr As System.IntPtr
Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles _
Me.Shown
NotifyIcon1.Visible = True
End Sub
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) _
Handles Timer1.Tick
Static Z = 0
Dim BH As New SolidBrush(Color.LightGray)
Dim BF As New SolidBrush(Color.Black)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillRectangle(BH, 0, 0, 15, 15)
g.DrawString(Rnd() * 10, Me.Font, BF, 0, 0)
iptr = bmp.GetHicon()
NotifyIcon1.Icon = System.Drawing.Icon.FromHandle(iptr)
g.Dispose()
BH.Dispose()
BF.Dispose()
Z += 1
End Sub
End Class Z ist nur zum Mitzählen der Durchgänge gedacht...
Hat jemand dafür eine Erklärung?
Und womöglich sogar 'ne Lösung?
Dilbert
--
while (!asleep()) sheep++; |