Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VB6] GDI Leak

Pagina: 1
Acties:

  • stereohead
  • Registratie: April 2006
  • Laatst online: 20:20
Hallo,

Ik ben in visual basic bezig met de gdi32 API's.

ik gebruik Ellipse om een circel te tekenen op het scherm zelf, dus niet op een Form.
Zie de code hieronder


Visual Basic:
1
2
3
4
5
6
7
8
9
Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long


Sub Timer1_Timer()

    'Draw the Ellipse on the Screen's DC
    Ellipse GetWindowDC(0), 100, 100, 150, 150
End Sub


Zoals je ziet doe ik dat in een timer (dat moet nu eenmaal voor de toepassing waarin ik het gebruik)

Via Taskmanager hou ik het aantal GDI Objecten in de gaten, dit wordt alleen steeds meer en zodra het boven de 9.999 komt, loopt mijn programma vast.

Ik moet dus de Ellipse's die ik maak, weer verwijderen lijkt mij..., maar hoe doe ik dat?

Het gekke is dat als ik i.p.v. op het scherm zelf teken, op mijn form teken ( dus GetWindowDC(0) vervang door Me.hdc) dat het aantal objecten niet stijgt

[ Voor 8% gewijzigd door stereohead op 26-03-2008 08:54 ]


  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 12:36

ZaZ

Tweakers abonnee

van MSDN
The GetDC function can be used to retrieve a device context for the entire screen.

After painting is complete, the ReleaseDC function must be called to release the device context. Not releasing the window device context has serious effects on painting requested by applications.

Lekker op de bank


  • stereohead
  • Registratie: April 2006
  • Laatst online: 20:20
Tnx, ik zocht de hele tijd alleen maar op deleteDc deleteObject e.d. vandaar dat ik niet op releaseDd kwam.

Het werkt nu goed in ieder geval. dit is de code zoals ik het nu heb.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Private Sub Timer1_Timer()
    temphwnd = GetDC(0)

    'Draw the Ellipse on the Screen's DC 
    Ellipse temphwnd, 100, 100, 150, 150
    
    ReleaseDC 0, temphwnd
End Sub

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 13:38

sopsop

[v] [;,,;] [v]

Geen idee of het een issue is, maar de timer van VB6 is nou niet echt precies te noemen. Voor mediaapplicaties kun je beter een high resolution timer gebruiken, zoals deze: http://www.vbaccelerator....es/HiResTimer/article.asp

  • stereohead
  • Registratie: April 2006
  • Laatst online: 20:20
Het maakt voor mijn applicatie niets uit, maar toch bedankt. Ik ben zelf eigenlijk niet zo gek op die timers :)