Domanda

sto disegnando un rettangolo, dormire per pochi millisecondi - allora voglio cancellare il rettangolo, ma non riesco a capire come. (Il rettangolo è seduto su un grafico, quindi non posso semplicemente coprire con un altro rettangolo)

                graphics.DrawRectangle(p, innerRectangle)
                System.Threading.Thread.Sleep(75)
                Next I want to clear the rectange...
È stato utile?

Soluzione

È necessario ridisegnare la grafica (o almeno la parte di sotto del rettangolo). Se si tratta di una casella di immagine o qualcosa di simile, utilizzare Invaldiate () per forzare un ridisegno.

Altri suggerimenti

Se il rettangolo è seduta completamente sopra il grafico che si dovrebbe essere in grado di ridisegnare solo o aggiornare la grafica sottostante. Se non lo è, sarà necessario ridisegnare il rettangolo utilizzando il colore di sfondo, e poi aggiorna la grafica sottostante.

Credo che dovrebbe funzionare per copiare i dati originali dalla superficie in una bitmap temporanea prima di disegnare il rettangolo e quindi disegnare la bitmap al suo posto.

Aggiorna

C'è già una risposta accettato, ma ho pensato ho potuto condividere un esempio di codice in ogni caso. Questo disegna il rettangolo dato in rosso sul controllo data, e ripristina la zona dopo 500 ms.

public void ShowRectangleBriefly(Control ctl, Rectangle rect)
{
    Image toRestore = DrawRectangle(ctl, rect);
    ThreadPool.QueueUserWorkItem((WaitCallback)delegate
    {
        Thread.Sleep(500);
        this.Invoke(new Action<Control, Rectangle, Image>(RestoreBackground), ctl, rect, toRestore);
    });
}

private void RestoreBackground(Control ctl, Rectangle rect, Image image)
{
    using (Graphics g = ctl.CreateGraphics())
    {
        g.DrawImage(image, rect.Top, rect.Left, image.Width, image.Height);
    }
    image.Dispose();
}

private Image DrawRectangle(Control ctl, Rectangle rect)
{
    Bitmap tempBmp = new Bitmap(rect.Width + 1, rect.Height + 1);
    using (Graphics g = Graphics.FromImage(tempBmp))
    {
        g.CopyFromScreen(ctl.PointToScreen(new Point(rect.Top, rect.Left)), new Point(0, 0), tempBmp.Size);
    }

    using (Graphics g = this.CreateGraphics())
    {
        g.DrawRectangle(Pens.Red, rect);
    }
    return tempBmp;
}

Ho avuto lo stesso problema e risolto con un pannello aggiuntivo disegnato sul modulo principale e visualizzare / nascondere, dimensionato e posizionato secondo necessità.

SelectionBox box = new SelectionBox();
box.Location = location;
box.Size = size;
box.Visible = true;

Poi, quando rettangolo non è più necessario, basta nasconderlo chiamando:

box.Visible = false;

La classe del pannello è realizzato con la trasparenza per assicurare che la grafica overlay non nasconde altri contenuti della finestra.

  [System.ComponentModel.DesignerCategory("Code")]
  public class SelectionBox : Panel
  {
    protected override void OnPaint(PaintEventArgs e)
    {
      const int penWidth = 2;
      int offset = penWidth - 1;
      using (Pen pen = new Pen(Color.Red, 2))
        e.Graphics.DrawRectangle(pen, offset, offset, 
          ClientSize.Width - offset - 1, ClientSize.Height - offset - 1);
    }

    protected override CreateParams CreateParams
    {
      get
      {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
        return cp;
      }
    }
  }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top