Avatar billede czix Nybegynder
23. maj 2008 - 21:35 Der er 6 kommentarer og
1 løsning

Bitmap på overfladen af en UserControl?

Hej,

jeg har gang i et projekt, hvor jeg skal have tegnet en grafen på overfladen af en controller. Det jeg har gjort indtil videre, er, at gentegne hele grafen i hvergang, der kommer en ny værdi i OnPaint. Det sløver processoren gevaldig, og derfor tænkte jeg på, at oprette et bitmap, hvorpå de nye værdier bliver tilføjes selve bitmappet. Så er der selvfølgelig nogle småting med at gentage, når den bliver minimeret osv., men den tager vi til den tid. Det vigtigeste er at få minimeret forbruget af CPU-kraft.

                using (Pen Graphpen = new Pen(Color.Black))
                {
                    int sampleCount = _samples.Count;

                    PointF[] points = new PointF[sampleCount];
                    try
                    {
                        for (int idx = 0; idx < sampleCount; ++idx)
                        {
                            points[idx] = new PointF(idx, ClientSize.Height - (_samples[idx] * delta) + smallest * delta);
                        }
                        if (points != null && sampleCount != 1)
                            g.DrawLines(Graphpen, points);
                    }
                    catch (Exception)
                    { }
                }
}

Spørgsmålet går så på, hvordan får jeg Bitmap'et til at ligge transparent på overfladen af controlleren?
Avatar billede aaberg Nybegynder
24. maj 2008 - 13:31 #1
Du kan tegne din bitmap i OnPaint metoden!

protected override void OnPaint(PaintEventArgs e)
{
  base.OnPaint(e);

  e.Graphics.DrawImage(myBitmap, new Point(0, 0));
}

Så skal du bare sørge for at dit billede har en gennemsigtig baggrund.
Avatar billede czix Nybegynder
26. maj 2008 - 21:29 #2
Hvis jeg gør følgende i OnPaint:

g = Graphics.FromImage (_bitGraph);

og så derefter lader g.Drawlines af mit point-array, og så:

g.DrawImage(_bitGraph, new Point(0, 0)); , hvorfor tegner den så ikke?
Avatar billede aaberg Nybegynder
26. maj 2008 - 22:18 #3
Fordi dit Graphics object peger på BitMap billedet, og ikke på din UserControl. Så du bliver altså ved med at tegne på et billede som ligger i memory og aldrig bliver tegnet på skærmen.

følgende kode:

g.DrawImage(_bitGraph, new Point(0, 0));

skifter du ud med:

e.Graphics.DrawImage(_bitGraph, new Point(0,0));
Avatar billede czix Nybegynder
26. maj 2008 - 22:58 #4
Okay, hvilken forskel det gør, når jeg gør følgende til at starte med:

protected override void OnPaint (PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g = Graphics.FromImage(_bitGraph);
.
.
.
g.DrawImage(_bitGraph, new Point(0,0));
}

Men det virker ihvertfald nu. Er det muligt, at have flere lag af Bitmaps ovenpå hinanden, hvis jeg f.eks. vil have grids under grafen?
Avatar billede aaberg Nybegynder
27. maj 2008 - 09:40 #5
Nedenstående kode giver ingen mening:
Graphics g = e.Graphics;
g = Graphics.FromImage(_bitGraph);

Først sætter du g = e.Graphics. Derefter fjerner du referencen og sætter g = Graphics.FromImage(_bitGraph). Dermed bliver den første linje overflødig!

Gaphics objektet er overfladen du tegner på. Hvis du får din Graphics ved at kalde FromImage, så er overfladen det billede du giver som parameter. Hvis du bruger det graphics objekt der bliver sendt med OnPaint metoden i PaintEventArgs objektet, er overfladen din Control.

Du kan godt tegne flere Bitmaps ovenpå hinanden:

Bitmap b1 = new Bitmap(..);
Graphics gb1 = Graphics.FromImage(b1);
... //Tegn på b1 ved at bruge gb1 Graphics objecktet.

Bitmap b2 = new Bitmap(..);
Graphics hb2 = Graphics.FromImage(b2);
... //Tegn på b2 ved at bruge gb2 Graphics objecktet.

//Til sidst tegner du det hele på din Control:
e.Graphics.DrawImage(b1, new Point(0,0));
e.Graphics.DrawImage(b2, new Point(0,0));
Avatar billede czix Nybegynder
27. maj 2008 - 19:45 #6
Arh okay, det giver mening. Jeg har fået det til virke ud for det. Så send et svar..
Avatar billede aaberg Nybegynder
27. maj 2008 - 21:42 #7
svar :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester