Avatar billede globen Nybegynder
05. oktober 2007 - 09:29 Der er 2 kommentarer og
1 løsning

System.Drawing

Hej eksperter,

Jeg er lige gået i gang med, at eksperimentere lidt med System.Drawing namespacet. Jeg har prøvet at lave en lille app, hvor jeg tegnede en firkant, som så skal flytte lidt tilfældigt rundt på skærmen. Det går fint med at optegne et Rectangle ved instansiering af min Form, men derefter går det ikke som jeg vil. Kast et blik på denne kodestump:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        rnd = new Random();
        solidBrush = new SolidBrush(Color.Black);
        rectangle = new Rectangle(50, 50, 50, 50);
        Thread t = new Thread(new ThreadStart(Run));
        t.Start();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        graphics = e.Graphics;
        graphics.FillRectangle(solidBrush, rectangle);
    }

    public void Run()
    {
        while (true)
        {
            Thread.Sleep(2000);
            x = rnd.Next(0, 200);
            y = rnd.Next(0, 200);
            rectangle.X = x;
            rectangle.Y = y;
            //graphics.FillRectangle(solidBrush, rectangle);
            //Udkommenterer jeg ovenstående linie, får jeg en ArgumentException: parameter not valid
        }
    }

    private Graphics graphics;
    private SolidBrush solidBrush;
    private Rectangle rectangle;
    private int x;
    private int y;
    private Random rnd;
}

Nogen der lige kan fortælle mig hvad jeg ikke ved?
Avatar billede bvli Praktikant
05. oktober 2007 - 10:49 #1
Hej.

Du skal ikke tegne i en anden tråd end gui-tråden. Tegn kun i din OnPaint override. Din løsning er nok lidt overkill synes jeg.

Prøv evt:

[...] Slet tråd-ting..

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

public Form1() {
  [..]
  timer = new System.Windows.Forms.Timer();
  timer.Interval = 200;
  timer.Tick += new EventHandler(timer_Tick);
  timer.Enabled = true;
}

private void timer_Tick(object sender, EventArgs e)
{
  rectangle.X = rnd.Next(0, 200);
  rectangle.Y = rnd.Next(0, 200);
  Invalidate();
}

protected override void OnPaint(PaintEventArgs e)
{
  e.Graphics.FillRectangle(solidBrush, rectangle);
}


/B :)
Avatar billede globen Nybegynder
05. oktober 2007 - 11:08 #2
Lige præcis hvad jeg ledte efter... Hit med et svar :)
Avatar billede bvli Praktikant
05. oktober 2007 - 11:13 #3
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