Degeim Skrevet 6. april 2006 Del Skrevet 6. april 2006 (endret) Jeg har en zoom-funksjon som fungerer utmerket, hvis man ser bort fra et lite problem. Jeg har ikke for vane å se bort fra problemer, så jeg vil ha det bort. Problemet er at det zoomede bildet flimrer. Dim tG As Graphics = Zoom.CreateGraphics ' Zoom er en FORM tG.Clear(Color.White) Dim Rekta As New Rectangle(0, 0, 150, 150) Dim StX As Integer = e.X - 75 / ZoomFaktor Dim StY As Integer = e.Y - 75 / ZoomFaktor Dim W As Integer = 150 / ZoomFaktor tG.DrawImage(oGNotat, Rekta, StX, StY, W, W, GraphicsUnit.Pixel) Jeg skjønner at (rett meg om det er galt) det flimrer fordi jeg bruker tG.Clear. Men denne ser jeg på som høyst nødvendig, da det uten den vil fortsette å tegne over forrige bilde - og alle bilder før det. I VB6.0 brukte jeg BitBlt til slikt, men jeg vet ikke hvordan dette anvendes i .Net. Det greieste for meg ville vært om noen kunne kikke på koden min her, og komme med forslag - så sant desse eksisterer. Takk, Degeim Endret 6. april 2006 av Degeim Lenke til kommentar
wolf5 Skrevet 7. april 2006 Del Skrevet 7. april 2006 (endret) Ville prøvd med doublebuffering på formen. Kanskje det hjelper. De som har kodet spill o.l. fra gammel og nytt av vet at det å tømme skjermen for deretter å bygge det opp mens bruker ser på, fører til flimmer. Det som må skje er at man tegner nytt bilde i bakgrunnen og bytter det med det som er synlig for øyeblikket. Så tegner man neste bilde og fortsetter slik. Tror DoubleBuffered egenskapen på Forms har som oppgave å gjøre dette for deg. Så prøv Zoom.DoubleBuffered=true. Alternativ bruk: [DllImport("user32.dll")] public static extern bool LockWindowUpdate(IntPtr hWndLock); og skriv LockWindowUpdate(Zoom.Handle) før du starter Clear og avslutt med LockWindowUpdate(IntPtr.Zero) når du har tegnet ferdig. Endret 7. april 2006 av wolf5 Lenke til kommentar
Degeim Skrevet 7. april 2006 Forfatter Del Skrevet 7. april 2006 Takk, jeg vil prøve å bruke metoden med doublebuffer, men hvordan anvender jeg den? Hva må jeg endre i koden min? Takk, Degeim Lenke til kommentar
wolf5 Skrevet 7. april 2006 Del Skrevet 7. april 2006 Google is your best friend: http://www.codeproject.com/csharp/DoubleBuffering.asp Har aldri brukt det før så du vet like mye som meg hvordan det er brukt i .Net. Tror det holder å sette doublebuffered til true, og det er mulig du må gjøre tegningen din i override OnPaint på zoom formen for at doublebuffering skal gjøres for deg. Jeg tenker .Net flipper tegneflater før og etter OnPaint koden er kjørt, slik at du alltid tegner på den skjulte flaten, som da vil bli vist etter du er ferdig slik at du nå kan tegne nytt bilde på den nå nye skjulte flaten. Lenke til kommentar
wolf5 Skrevet 7. april 2006 Del Skrevet 7. april 2006 Testet kjapt selv. Tror jeg ser hva du gjør feil. Du tegner skjermbildet på Mouse_Move event. Istedet for det. Kjør all tegning i override OnPaint på zoomformen. Disse leser data som du gjør tilgjengelig i OnMouseMove eventhandlern din. C# kode men du klarer sikkert å oversette. finnes verktøy på google om ikke. protected override void OnPaint(PaintEventArgs e) { e.Graphics.Clear(Color.White); Rectangle r = new Rectangle(0, 0, 150, 150); float StX = eX - 75 / ZoomFaktor; float StY = eY - 75 / ZoomFaktor; float W = 150 / ZoomFaktor; //gjør diverse... e.Graphics.DrawImage(oGNotat, r, StX, StY, W, W, GraphicsUnit.Pixel); base.OnPaint(e); } float eX = 0; float eY = 0; private void Zoom_MouseMove(object sender, MouseEventArgs e) { eX = e.X; eY = e.Y; } Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå