[C#] override function aan/uitzetten

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
In een programmaatje waar ik mee bezig ben wordt meerdere keren per seconde een Bitmap getekend (een grafiek). Ik heb een eigen Control class gemaakt om Bitmaps te tonen, waarin onPaint en onPaintBackground events worden geblokkeerd. Dat levert een aanzienlijke snelheidswinst op, maar als de grafiek niet wordt geupdate (omdat het programma op pauze staat bijvoorbeeld) zou het fijn zijn als ik de onPaint events weer gewoon kon laten verlopen.

Kan ik een override functie aan- en uitzetten tijdens runtime?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    class BitmapBox : Control
    {
        protected override void OnPaint(PaintEventArgs e)
        {
            //Do Nothing
        }

        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            //Do Nothing
        }

        public void DrawBitmap(Bitmap img)
        {
            var g = CreateGraphics();
            g.DrawImage(img, 0, 0);
            g.Dispose();
            img.Dispose();
        }
    }

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Gewoon zoiets maken :?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    class BitmapBox : Control
    {
        public bool Passthrough  { get; set; }
        protected override void OnPaint(PaintEventArgs e)
        {
            if( Passthrough ) base.OnPaint(e);            
        }

        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            if( Passthrough ) base. OnPaintBackground(pevent);
        }

        public void DrawBitmap(Bitmap img)
        {
            var g = CreateGraphics();
            g.DrawImage(img, 0, 0);
            g.Dispose();
            img.Dispose();
        }
    }

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Wat bedoel je precies met 'een override uitzetten' ?
Je bedoelt dat je je eigen code (die je in de overriden method gezet hebt), niet meer wilt uitvoeren, en gewoon de functionaliteit van de base-class wilt uitvoeren, zonder je eigen code ?

Je kan toch gewoon dit doen:
code:
1
2
3
4
5
6
7
8
protected override void OnPaint( PaintEventArgs e )
{
     base.OnPaint(e);
     if( eenConditie )
     {
         // doe mijn eigen ding.
     }
}


Kruipt die woy gewoon voor :(

[ Voor 4% gewijzigd door whoami op 31-08-2009 16:03 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Bozozo schreef op maandag 31 augustus 2009 @ 15:55:

Kan ik een override functie aan- en uitzetten tijdens runtime?
Je kunt een virtual function overriden of niet, maar niet aan of uitzetten.

Je kan wel een soort guard erin maken:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    class BitmapBox : Control
    {
        protected override void OnPaint(PaintEventArgs e)
        {
            if (notUpdate)
              base.OnPaint(e);
            else 
              //Do Nothing
        }

        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            if (notUpdate)
              base.OnPaintBackground(e);
            else 
              //Do Nothing
        }
    }


De vraag is alleen waarom je tijdens het tekenen wel deze events wilt blokkeren, en als er niks getekend hoeft te worden niet.... :?

Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

Wat gemakkelijker eleganter is (nog niet geprobeerd, maar als je de hele onPaint() stopzet moeten er toch rare dingen met je form gebeuren?), is tekenen naar een aparte buffer en deze buffer enkel wijzigen wanneer nodig (wanneer er iets verandert in je grafiek dus). Laat de OnDraw() override gewoon voortdurend deze buffer tonen.

In je DrawBitmap() doe je dan iets zoals dit
C#:
1
2
3
4
offScreenBmp = new Bitmap(this.Width, this.Height); //globale variabele
Graphics offScreenGr;
offScreenGr = Graphics.FromImage(offScreenBmp);
offScreenGr.DrawImage(blah); // al je drawing code

Die offScreenGr teken je dus in, en daar hoef je enkel eenmalig in te tekenen wanneer je je grafiek wijzigt.
In je OnPaint() zet je dan gewoonweg
C#:
1
2
Graphics gfs = e.Graphics;
gfs.DrawImage(offScreenBmp, 0, 0);

Het eigenlijke rekenwerk gebeurt dus niet meer iedere keer je scherm refreshet, maar slechts heel af en toe, wanneer er effectief iets wijzigt en jij dus zelf DrawBitmap() aanroept.

[ Voor 13% gewijzigd door boe2 op 31-08-2009 16:44 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Topicstarter
Die base.blabla() constructie zocht ik dus :) Veel dank.

Die bitmap houden is wel een optie... zal er eens naar kijken.

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
Bitmap alleen tekenen wanneer er iets verandert is je beste manier om dit te doen, de flag is een oplossing als je rapid prototyping aan het doen bent.

Kijk eens naar MVC patroon.

[ Voor 63% gewijzigd door NC83 op 31-08-2009 23:39 ]

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max

Pagina: 1