Announcement

Collapse
No announcement yet.

GetDC gibt 0 zurück

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GetDC gibt 0 zurück

    Hi,

    Habe in meinem VB.Net Projekt das Problem, dass die API-Funktion GetDC 0 zurückgibt, nachdem das Programm einige Zeit fehlerfrei läuft.
    Der Programm sieht folgendermaßen aus:
    Code:
    Public Class Form_Main
    Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Int32) As Int32 Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Int32, ByVal hdc As Int32) As Int32 Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Int32) As Int32 Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Int32) As Int32 Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Int32, ByVal hObject As Int32) As Int32 Private Declare Function Rectangle Lib "gdi32.dll" (ByVal hdc As Int32, ByVal x1 As Int32, ByVal y1 As Int32, ByVal x2 As Int32, ByVal y2 As Int32) As Int32 Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Int32, _ ByVal x As Int32, ByVal y As Int32, _ ByVal nWidth As Int32, ByVal nHeight As Int32, _ ByVal hSrcDC As Int32, _ ByVal xSrc As Int32, ByVal ySrc As Int32, _ ByVal dwRop As Int32) As Int32 Private myBitmap As Bitmap Private bmpHDC As Int32 Private bmpHandle As Int32 Private frmHDC As Int32 Private frmHandle As Int32 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    myBitmap = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
    End Sub Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
    ' Flackern des Forms verhindern 'MyBase.OnPaintBackground(e)
    End Sub Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    bmpHDC = CreateCompatibleDC(Me.CreateGraphics().GetHdc().ToInt32()) bmpHandle = SelectObject(bmpHDC, myBitmap.GetHbitmap().ToInt32()) ' Hier wird gezeichnet, Input verarbeitet usw. ' (unter Anderem wird auch die Framerate berechnet, die ich auf ca. 30 FPS beschränkt habe. In der Zeit in der das Programm läuft wird diese Framerate auch gehalten.) ' Anmerkung: Es wird auf bmpHDC gezeichnet, zum Beispiel: Dim ReturnValue As Int32 = Rectangle(bmpHDC, 0, 0, 10, 10) ' Nachdem alles gezeichnet wurde endet OnPaint folgendermaßen: frmHandle = Me.Handle.ToInt32() ' An dieser Stelle erhält frmHDC nach einiger Zeit ohne sonstige Änderungen den Wert 0 frmHDC = GetDC(frmHandle) ' Die Bitmap wird auf das Form kopiert ReturnValue = BitBlt(frmHDC, 0, 0, Me.ClientSize.Width, Me.ClientSize.Height, bmpHDC, 0, 0, 13369376) ReturnValue = ReleaseDC(frmHandle, frmHDC) ReturnValue = DeleteDC(bmpHDC) Me.Invalidate()
    End Sub
    End Class
    An der im Code erwähnten Stelle gibt GetDC irgendwann den Wert 0 zurück, sodass BitBlt nicht mehr auf das Form kopiert.

    Hat jemand eine Idee, woran das liegt und wie ich das verhindern kann?


    MfG,

    Dagophil

    EDIT:
    Ich habe herausgefunden woran es liegt:
    Die Bitmap bleibt im Arbeitsspeicher erhalten, sodass dieser immer voller wird. Das Programm stürzt ab, sobald der Arbeitsspeicher überfüllt ist.

    EDIT2:
    Ich habe keinen Schimmer wie ich das nun lösen kann, kann mir ab hier jemand weiterhelfen?

    EDIT3:
    Okay, bin jetzt wieder weiter:
    Das Arbeitsspeicher-Problem habe ich gelöst, indem ich keine von VB vorgegebene Bitmap verwende, sondern per CreateCompatibleBitmap eine Bitmap erzeuge. Dennoch stürzt das Programm ab, diesmal aber nach ca. der doppelten Anzahl an Frames. Hat jemand eine Idee woran das liegen könnte? Weiß nicht ob es immer noch an GetDC liegt.

    EDIT4:
    Habe nun festgestellt, dass bevor GetDC 0 liefert, die Funktion SelectObject manchmal 0 zurückgibt.

    EDIT5:
    So, nach langem Suchen habe ich das Problem endlich gelöst:
    Ich habe nach CreateCompatibleBitmap die erzeugte Bitmap nach der Verwendung mit DeleteObject nicht mehr gelöscht, somit war anscheinend irgendein Speicher überladen oder sowas. Nun, nachdem DeleteObject direkt nach dem Kopieren der Bitmap auf das Form eingefügt wurde, läuft das Programm endlich solange bis es vom Benutzer beendet wird.
    Zuletzt editiert von dagophil; 29.06.2010, 11:08.
Working...
X