Question

Puis-je supprimer l'ancien rectangle que j'ai dessiné et dessiner un nouveau rectangle?

private void panel1_MouseClick(object sender, MouseEventArgs e)
{
        Graphics g = this.panel1.CreateGraphics();
        Pen pen = new Pen(Color.Black, 2);

        g.DrawRectangle(pen, 100,100, 100, 200);
        g.dispose();
}

Pas de solution correcte

Autres conseils

Non, vous ne pouvez pas quelque chose de « supprimer » qui a déjà été établi. Vous pouvez Ecraser avec quelque chose d'autre, mais le dessin avec des objets Graphics est comme la peinture dans la vraie vie: une fois que la peinture est sèche, vous ne pouvez peindre avec une autre couleur, vous ne pouvez pas « effacer «il.

Vous ne devriez probablement pas de dessiner les choses en réponse à une MouseClick, que ce soit. Il est préférable de que dessiner des choses en réponse à un événement Paint. Ce que je ferais dans cette situation est d'ajouter une structure Rectangle à une liste sur la MouseClick puis appelez panel1.Invalidate() pour lui demander de se redessiner. Ensuite, en cas de Paint pour le panneau, faire le dessin là.

Cela faire d'une pierre deux coups, parce que vous serez en mesure de chose « effacer » en les retirant simplement de la liste des choses à dessiner.

Ceci est habituellement fait en maintenant une collection d'objets que vous voulez dessiné. Le clic de la souris devrait mettre à jour cette collection, puis dire la fenêtre (ou l'effet région) pour se rafraîchir. Cela a l'énorme avantage de préserver tout ce que vous avez dessiné si la fenêtre est déplacée hors écran, caché derrière d'autres fenêtres, réduite au minimum, etc.

Pour une solution rudimentaire, créer une hiérarchie des types de formes étirables dérivées d'une classe abstraite forme commune, et l'utilisation, par exemple, une liste pour la collection. La classe de forme de base aura une méthode abstraite Draw que les classes dérivées remplacent.

Pour une solution plus de force industrielle, regarder autour de graphes de scène 2-D.

On peut utiliser des méthodes de Graphics.Save() et Graphics.Restore(state) pour cela. Par exemple:

private void SaveRestore2(PaintEventArgs e)
{
    // Translate transformation matrix.
    e.Graphics.TranslateTransform(100, 0);

    // Save translated graphics state.
    GraphicsState transState = e.Graphics.Save();

    // Reset transformation matrix to identity and fill rectangle.
    e.Graphics.ResetTransform();
    e.Graphics.FillRectangle(new SolidBrush(Color.Red), 0, 0, 100, 100);

    // Restore graphics state to translated state and fill second

    // rectangle.
    e.Graphics.Restore(transState);
    e.Graphics.FillRectangle(new SolidBrush(Color.Blue), 0, 0, 100, 100);
}

http://msdn.microsoft.com/ fr-fr / bibliothèque / system.drawing.graphics.restore.aspx

En outre, selon l'application, vous pouvez regarder en utilisant DrawReversibleFrame. Vous pouvez modifier l'emplacement du rectangle en appelant la méthode offset.

Au lieu d'appeler g.DrawRectangle (stylo, 100,100, 100, 200); , Maintenir le rectangle comme un objet qui sera dessiné par l'objet graphique. Chaque fois que vous mettrez à jour cet objet rectangle nouveau et objet graphique dessinera le nouveau.

L'actualisation devrait effacer l'ancien rectangle et graphiques dessinera le nouveau.

Vous pouvez simplement utiliser VisualBasic PowerPack, il est inclus avec ma version de Visual Studio 2008

Voici un exemple de code qui dessinez un rectangle sur une zone de texte, à savoir que je donne une bordure personnalisée

    Dim x = TextBox1.Location.X
    Dim y = TextBox1.Location.Y
    Dim width = TextBox1.Width
    Dim height = TextBox1.Height
    Dim ShapeContainer1 As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
    Me.Controls.Add(ShapeContainer1)
    Dim RectangleShape1 As New Microsoft.VisualBasic.PowerPacks.RectangleShape
    ShapeContainer1.Shapes.AddRange(New Microsoft.VisualBasic.PowerPacks.Shape() {RectangleShape1})
    RectangleShape1.Location = New System.Drawing.Point(x - 1, y - 1)
    RectangleShape1.Size = New System.Drawing.Size(width + 1, height + 1)
    RectangleShape1.BorderColor = Color.MistyRose
    ShapeContainer1.Refresh()

Le code est auto décrire mais si vous avez un problème, il suffit de laisser un message ...

Je pense en utilisant DrawReversibleFrame est la bonne solution. Le premier appel dessiner le rectangle, le deuxième appel undraw et ainsi de suite.

Voici un exemple de code, un clic sur le bouton fera apparaître le rectangle / disapper.

Rectangle pRect = new Rectangle(10, 10, 20, 20);
private void rect_Click(object sender, EventArgs e)
{
  ControlPaint.DrawReversibleFrame(pRect, this.BackColor, FrameStyle.Thick);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top