2012-06-14 7 views
8

Chciałem tylko umieścić zaznaczenie na mojej skrzynce obrazowej.image, ale stało się to po prostu gorsze od jakiejś małej irytującej sytuacji. Myślałem o innym obrazku nad głównym obrazkiem, ale wydawało mi się to leniwe. Muszę wiedzieć, czy istnieje sposób na stworzenie obszaru zaznaczenia (który będzie półprzezroczystym niebieskim obszarem) na obrazku. Obrazek, który narysuję za pomocą myszy i nie powinien zmieniać obrazu, nad którym pracuję.Jak wybrać obszar na obrazie PictureBox.Image za pomocą myszy w języku C#

próbki:

// Start Rectangle 
    // 
    private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     // Determine the initial rectangle coordinates... 
     RectStartPoint = e.Location; 
     Invalidate(); 
    } 

    // Draw Rectangle 
    // 
    private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     if (e.Button != MouseButtons.Left) 
      return; 
     Point tempEndPoint = e.Location; 
     Rect = 
      new Rectangle(
       Math.Min(RectStartPoint.X, tempEndPoint.X), 
       Math.Min(RectStartPoint.Y, tempEndPoint.Y), 
       Math.Abs(RectStartPoint.X - tempEndPoint.X), 
       Math.Abs(RectStartPoint.Y - tempEndPoint.Y)); 
     Invalidate(Rect); 
    } 

    // Draw Area 
    // 
    private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
    { 
     // Draw the rectangle... 
     if (pictureBox1.Image != null) 
     { 
      Brush brush = new SolidBrush(Color.FromArgb(128, 72, 145, 220)); 
      e.Graphics.FillRectangle(brush, Rect); 
     } 
    } 
+0

Czy chcesz utworzyć pole wyboru na obrazie w ramce obrazu? Czy pole wyboru będzie działać tak samo, jak klikanie i przeciąganie na pulpicie w celu utworzenia przezroczystego niebieskiego kwadratu? – 3aw5TZetdf

Odpowiedz

30

użyłem kodu, byłaś prawie tam. Musisz unieważnić obrazekBox1 zamiast prostokąta. Dodałem również czek na Rect, aby nie został narysowany, gdy nie został zainicjowany lub nie ma rozmiaru.

Kolejna ważna zmiana: stworzyłem Prostokąt tylko raz i dostosowałem jego położenie i rozmiar. Mniej śmieci do posprzątania!

EDIT

dodałem myszy kliknij prawym przyciskiem myszy obsługi do prostokąta.

private Point RectStartPoint; 
private Rectangle Rect = new Rectangle(); 
private Brush selectionBrush = new SolidBrush(Color.FromArgb(128, 72, 145, 220)); 

// Start Rectangle 
// 
private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    // Determine the initial rectangle coordinates... 
    RectStartPoint = e.Location; 
    Invalidate(); 
} 

// Draw Rectangle 
// 
private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    if (e.Button != MouseButtons.Left) 
     return; 
    Point tempEndPoint = e.Location; 
    Rect.Location = new Point(
     Math.Min(RectStartPoint.X, tempEndPoint.X), 
     Math.Min(RectStartPoint.Y, tempEndPoint.Y)); 
    Rect.Size = new Size(
     Math.Abs(RectStartPoint.X - tempEndPoint.X), 
     Math.Abs(RectStartPoint.Y - tempEndPoint.Y)); 
    pictureBox1.Invalidate(); 
} 

// Draw Area 
// 
private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
{ 
    // Draw the rectangle... 
    if (pictureBox1.Image != null) 
    { 
     if (Rect != null && Rect.Width > 0 && Rect.Height > 0) 
     { 
      e.Graphics.FillRectangle(selectionBrush, Rect); 
     } 
    } 
} 

private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     if (Rect.Contains(e.Location)) 
     { 
      Debug.WriteLine("Right click"); 
     } 
    } 
} 
+0

również możesz mi powiedzieć, w jaki sposób mogę utworzyć zdarzenie z kliknięciem prawym przyciskiem myszy na tej selekcji? –

+1

BTW: W swojej implementacji pędzel jest tworzony raz za razem. Spróbuj temu zapobiec. Poprawię również mój kod. –

+0

teraz wydaje się bardzo miękki i przydatny .. dzięki –

Powiązane problemy