2010-10-05 14 views
2

Mon code actuel me permet de dessiner des rectangles à partir d'un emplacement défini par l'utilisateur, mais pas de la façon dont je le souhaite. Je besoin d'être comme vous le feriez dans la peinture, voici mon code actuel:Dessiner un rectangle défini par l'utilisateur

espace de noms SimpleDraw2 {/// /// Description MainForm. /// public partiel classe MainForm: formulaire { bool IsMouseDown = false; Point MousePosition; int DrawShape = 0; Bitmap StoredImage;

public MainForm() 
    { 
     // 
     // The InitializeComponent() call is required for Windows Forms designer support. 
     // 
     InitializeComponent(); 

     // 
     // TODO: Add constructor code after the InitializeComponent() call. 
     // 
     pictureBox1.Image = new Bitmap (pictureBox1.Width,pictureBox1.Height);      
     StoredImage = new Bitmap(pictureBox1.Width,pictureBox1.Height); 
    } 

    void PictureBox1MouseDown(object sender, MouseEventArgs e) 
    { 
     IsMouseDown = true; 
     MousePosition = e.Location; 
     Graphics gStored = Graphics.FromImage(StoredImage); 
     gStored.Clear(Color.Transparent); 
     gStored.DrawImage(pictureBox1.Image, 0, 0); 
    } 

    void PictureBox1MouseUp(object sender, MouseEventArgs e) 
    { 
     IsMouseDown = false; 
    } 

    void PictureBox1MouseMove(object sender, MouseEventArgs e) 
    { 
     Graphics g = Graphics.FromImage(pictureBox1.Image); 
     if (DrawShape == 0) 
     { 
      Pen p = new Pen(Color.Red, 10); 
      if (IsMouseDown) 
      { 
       g.DrawLine(p,MousePosition,e.Location); 
       MousePosition = e.Location; 
      } 
     } 
     if (DrawShape == 1) 
     { 
      g.Clear(Color.Transparent); 
      g.DrawImage(StoredImage,0,0); 
      g.DrawRectangle(Pens.Green,MousePosition.X,MousePosition.Y,e.X,e.Y); 

     } 
     if (DrawShape == 2) 
     { 
      g.Clear(Color.Transparent); 
      g.DrawImage(StoredImage, 0, 0); 
      g.DrawEllipse(Pens.HotPink, MousePosition.X, MousePosition.Y, e.X, e.Y); 
     } 
     if (DrawShape == 3) 
     { 
      g.Clear(Color.Transparent); 
      g.DrawImage(StoredImage, 0, 0); 
      g.DrawArc(Pens.Indigo,pictureBox1.Bounds, e.Y, e.X); 
     } 
     //if (DrawShape == 4) 
     //{ 
     // g.Clear(Color.Transparent); 
     // g.DrawImage(StoredImage, 0, 0); 
     // g.DrawPolygon(Pens.Indigo, Point[] e.X); 
     //} 

     this.Refresh(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog ofd = new OpenFileDialog(); 
     if (ofd.ShowDialog() == DialogResult.OK) 
     { 
      axWindowsMediaPlayer1.URL = ofd.FileName; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     axWindowsMediaPlayer1.Ctlcontrols.pause(); 
     Bitmap bmp = new Bitmap(axWindowsMediaPlayer1.Width, axWindowsMediaPlayer1.Height); 
     Graphics gfx = Graphics.FromImage(bmp); 
     gfx.CopyFromScreen(PointToScreen(axWindowsMediaPlayer1.Location), new Point(0, 0), axWindowsMediaPlayer1.Bounds.Size, CopyPixelOperation.SourceCopy); 
     pictureBox1.BackgroundImage = bmp; 
     //axWindowsMediaPlayer1.Visible = false; 
     //pictureBox1.Visible = true; 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     Graphics gg = Graphics.FromImage(pictureBox1.BackgroundImage); 
     gg.Clear(Color.Transparent); 
     Graphics gStored = Graphics.FromImage(StoredImage); 
     gStored.Clear(Color.Transparent); 
     Graphics g = Graphics.FromImage(pictureBox1.Image); 
     g.Clear(Color.Transparent); 


    } 

    private void button4_Click(object sender, EventArgs e) 
    { 
     DrawShape = 1; 

    } 

    private void button6_Click(object sender, EventArgs e) 
    { 
     DrawShape = 2; 
    } 

    private void button8_Click(object sender, EventArgs e) 
    { 
     DrawShape = 3; 
    } 

    private void button7_Click(object sender, EventArgs e) 
    { 
     DrawShape = 0; 
    } 
} 

}

Si quelqu'un pouvait me aider à modifier mon code pour le fer sur la question pour le rendre facile glisser et d'en tirer système, il me reconnaissant de bien vouloir.

Merci à l'avance

Chris

Répondre

2

De msdn:

Dessine un rectangle spécifié par une paire de coordonnées , une largeur et une hauteur .

Donc, votre code ne fonctionnera pas:

g.DrawRectangle(Pens.Green,MousePosition.X,MousePosition.Y,e.X,e.Y); 

devrait être quelque chose comme

g.DrawRectangle(Pens.Green, MousePosition.X, MousePosition.Y, Math.Abs(e.X - MousePosition.X), Math.Abs(e.Y - MousePosition.Y)); 
+0

Le même problème se pose toujours, il enregistre le dernier emplacement et dessine un carré à partir de l'endroit où il a quitté la dernière image. –

1

Le plus gros problème que je vois est que vous essayez de dessiner dans les événements de souris. Cela signifie que votre dessin sera effacé dès l'instant où vous recevez un événement d'actualisation. Ne dessinez que dans les événements Paint, jamais dans les événements de souris.

Si vous voulez que votre application dessine à la suite d'événements de souris, définissez un point, un rectangle ou quoi que ce soit dans les événements de souris (comme avec IsMouseDown), invalidez la zone que vous souhaitez modifier dans votre événement MouseMoved, puis dessinez votre rectangle ou quoi que ce soit dans votre événement Paint.