Gå til innhold

Hmm..gdi32 snurrig problem


Anbefalte innlegg

Snurrig sak, følgende kode (som tegner to streker) fungerer når den står i form_load , men ikke under command1_click.

Hvorfor ikke?

 

Private Declare Function LineTo Lib "gdi32" _

(ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Private Declare Function MoveToEx Lib "gdi32" _

(ByVal hdc As Long, ByVal x As Long, ByVal y As Long, _

lpPoint As POINTAPI) As Long

 

Private Type POINTAPI

x As Long

y As Long

End Type

 

Private Sub Command1_Click()

Dim RetVal As Long, pp As POINTAPI

Form1.ScaleMode = vbPixels

Picture1.AutoRedraw = True

Picture1.DrawWidth = 3

 

RetVal = MoveToEx(Picture1.hdc, 10, 10, pp)

RetVal = LineTo(Picture1.hdc, 100, 20)

 

 

RetVal = MoveToEx(Picture1.hdc, 90, 10, pp)

RetVal = LineTo(Picture1.hdc, 100, 30)

End Sub

Lenke til kommentar
Videoannonse
Annonse

Årsaken til problematiken er simpelthen at API-funksjonene du kaller til, i mostetning til alle eksisterende kommandoer i bildeboksklassen (såsom Pset, Line, Circle, osv.), ikke eksekverer oppdateringsprosedyren til buffervinduet som benyttes i tilknytning til AutoRedraw.

 

Når denne egenskapen er påkrudd, anvendes det nemlig en midlertidig buffer der alle tegneoperasjoner påføres før det endelig overføres til hovedvinduet (oppdateringsprosedyren). Dette vil - som du muligens har merket - forhindre flimring, da tegneoperasjoner som utføres direkte på hovedvinduet til tider kan være halvferdig når dette vinduet sendes til visning på skjermen.

 

Løsningen er å kalle oppdateringsprosedyren manuelt når du er ferdig med API-kallene. Dette kan gjøres nokså enkelt med følgende kommando:

 

Picture1.Refresh
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...