2017-12-08 8 views
1

Ich versuche, ein Volume Benutzerkontrolle (nur die Benutzeroberfläche). Ich habe alles funktioniert, außer wenn der Balken unter 50% der Bildbox fällt. Breite (was 100 ist) Ich möchte die Dreiecksfarbe ändern, zum Beispiel von Rot zu Grün. Die drei Zeilen, die im mouseMove-Ereignis kommentiert wurden, sind das, was ich erreichen möchte, aber das wird nicht funktionieren. Vielen Dank im Voraus.Malen Polygon bereits gezeichnet

Dies ist ein Beispiel meiner Kontrolle:

enter image description here

Mein Code so weit:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Windows; 

namespace ControlAudio 
{ 
    public partial class volumen: UserControl 
    { 
     Bitmap im_soundOn = Properties.Resources.sound_on; 
     Bitmap im_soundOff = Properties.Resources.sound_off; 
     int coordenadaX; 
     bool barClicked = false; 
     bool muted = false; 

     public volumen() 
     { 
      InitializeComponent(); 

     } 
     //Dibujar triangulo 
     private void pictureBox1_Paint(object sender, PaintEventArgs e) 
     { 
      var g = e.Graphics; 
      var points = new PointF[] { new PointF(0, 0), new PointF(1, 0), new PointF(0, 1) }; 

      var mx = g.Transform.Clone(); 

      g.TranslateTransform(100f, 100f); 
      g.ScaleTransform(-135f, -70f); 
      g.FillPolygon(Brushes.Olive, points); 
      g.Transform = mx; 
     } 

     private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      barClicked = true; 
     } 

     private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
     { 
      barClicked = false; 
     } 

     private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
     { 
      MouseEventArgs me = (MouseEventArgs)e; 
      Point coordenadasNuevas = me.Location; 
      coordenadaX = coordenadasNuevas.X; 

      if(barClicked && pictureBox1.Width <= 100) 
      { 
       if (coordenadaX > 100) 
       { 
        coordenadaX = 100; 
       } 
       pictureBox1.Width = coordenadaX; 
      } 

      //When it reaches 0 
      if (pictureBox1.Width == 0) { 
       pictureBox1.Width = 0; 
       muted = true; 
       pb_imagen.Image = im_soundOff; 
      } 
      else //When it goes over 0 
      { 
       muted = false; 
       pb_imagen.Image = im_soundOn; 
      } 

      //if(pictureBox1.Width <= 50) g.FillPolygon(Brushes.Olive, points); 
      //if(pictureBox1.Width >50 && pictureBox1.Width <= 90) g.FillPolygon(Brushes.Yellow, points); 
      //if (pictureBox1.Width > 90) g.FillPolygon(Brushes.Red, points); 

     }  
    } 
} 
+3

Speichern Sie die Informationen, die Sie benötigen für das Paint-Ereignis Rufen Sie einfach 'pictureBox1.Invalidate();' von der MouseMove-Methode auf. Verwenden Sie in dem Paint-Ereignis die Informationen, die Sie gespeichert haben, um Ihre Punkte oder Farben zu bestimmen, da Sie dort gerade malen. – LarsTech

+0

Sorry meine Ignoranz, aber ich bin neu in C# und ich weiß nicht, wie dieses Polygon-Gemälde funktioniert, ich weiß nur, es funktioniert und das Ändern einiger Werte kann ich verwenden. Aber ich weiß nicht, wie es gemacht ist. Ich bekomme den Anruf zu Invalidate(); aber ich weiß nicht, wie ich den Rest machen soll. – c4rlos96

+1

In Ihrem Paint-Ereignis verwenden Sie Brushes.Olive. Wenn Sie eine andere Farbe basierend auf einigen Informationen im MouseMove-Ereignis möchten, benötigen Sie eine Variable auf der Formularebene. Setzen Sie diese Variable auf die Pinselfarbe, die Sie verwenden möchten. Verwenden Sie diesen Pinsel in Ihrem FillPolygon, um die gewünschte Farbe zu verwenden. – LarsTech

Antwort

1

Um dies zu lösen, und dank @LarsTech, habe ich folgendes:

  1. eine Bürste mit der Standardfarbe Erstellt: Brush brush = Brushes.Red;

  2. Im pictureBox1_Paint Ereignis ich die vorherigen g.FillPolygon(Brushes.Olive, points); zu g.FillPolygon(brush, points); geändert

  3. Im MouseMove Fall habe ich die folgenden:

    if (pictureBox1.Width <= 50) 
    { 
        brush = Brushes.LightGreen; 
        pictureBox1.Invalidate(); 
    } 
    else if (pictureBox1.Width > 50 && pictureBox1.Width <= 90) 
    { 
        brush = Brushes.Yellow; 
        pictureBox1.Invalidate(); 
    } 
    else 
    { 
        brush = Brushes.Red; 
        pictureBox1.Invalidate(); 
    }