Gå til innhold

Zoom-funksjon, DrawImage, BitBlt


Anbefalte innlegg

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 av Degeim
Lenke til kommentar
Videoannonse
Annonse

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 av wolf5
Lenke til kommentar

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

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

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...