08. oktober 2006 - 21:56Der er
8 kommentarer og 1 løsning
Refresh() på Graphics object
Jeg har følgende kode (simplet ekesempel) som tegner nogle streger på en PictureBox control - kodeblokken bliver kaldt gentagne gange efter hinanden med intervaller på 1 sekund og effekten skulle gerne være at man ser èen streg der flytter sig:
using (Graphics g = pictureBox1.CreateGraphics()) { //g.Clear(Color.White); g.DrawLine(new Pen(Color.Black), 0, 0, DateTime.Now.Millisecond,100); pictureBox1.Refresh(); }
Men resultatet er at man ser flere streger samtidigt. Hvis jeg udkommenterer første linie i blokken fungere det efter hensigten, bortset fra at baggrunden i min PictureBox nu bliver hvid og dermed "sletter" det baggrunds-billede jeg har i PictureBoxen.
Jeg troede egentlig at en Refresh() på PictureBoxen ville slette "gamle" streger, men det virker ikke sådan. Hvad gør jeg galt her...?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Det jeg egentlig savner er en måde at slette alt det man har tegnet med Graphics objektet (uden samtidig at male hele baggrunden). Troede lige at GraphicsState var løsningen, således at følgende kode ikke ville tegne den blå streg, men sådan virker det desværre ikke...
Når man kalder refresh, invalideres kontrollen og gentegnes.
Det du bør gøre er at override OnPaint hvorved du direkte har dit grafiske objekt. Følgende lille eksempel viser hvorledes du kan gøre. Her har jeg ladet en timer refreshe kontrollen i et interval. Kontrollen tegner blot en streg over det billede som er i PictureBoxen
namespace PictureBox { using System; using System.Windows.Forms; using System.Drawing;
class MyPictureBox : PictureBox { private Timer refreshTimer = new Timer(); private int counter;
public MyPictureBox() { this.DoubleBuffered = true;
using (Pen pen = new Pen(Color.Magenta)) { if (this.counter > paintEventArgs.ClipRectangle.Width) { this.counter = 1; }
Point p1 = new Point(this.counter, paintEventArgs.ClipRectangle.Y); Point p2 = new Point(this.counter, paintEventArgs.ClipRectangle.Y + paintEventArgs.ClipRectangle.Height);
Den gentegner fint når jeg sætter doublebuffered til true, men så har min control ikke længere transparent baggrund. Når jeg sætter doublebuffered til false, er der transparent baggrund, men så gentegner kontrollen ikke sig selv. Hvorfor kan jeg ikke få begge dele... :-(
Jeg bruger følgende kode, tyvstjålet fra nettet, for at give min control transparent baggrund (men den knækker åbenbart når doublebuffered er sat til true):
Øvrige styles kan med fordel sættes når du selv tegner din kontrol: this.SetStyle(ControlStyles.DoubleBuffer, true); // Er det samme som at sætte this.DoubleBuffered = true; this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.UserPaint, true);
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.