Benutzer mit den meisten Antworten
Punkt mittels Button in PictureBox einfügen

Frage
-
Hi Leute,
Folgendes: Ich habe 5 Buttons und mit einem Klick auf einer dieser Buttons sollte je nach Button ein ander farbiger Punkt in der PictureBox gesetzt werden können. Also das heist wenn ich BTN1 anklicke möchte ich einen nlauen Punkt setzen können und wenn ich BTN2 anklicke möchte ich einen roten Punkt setzen können usw.
Ich habe auch schon einen relativ guten Ansatz nur noch nicht soweit gekommen dass es funktioniert
private void pictureBox1_Click(object sender, EventArgs e) { if (button1 == checked) { Graphics g = Graphics.FromImage(pictureBox1.Image); g.FillEllipse(Brushes.Blue, e.X, e.Y, 10, 10); pictureBox1.Invalidate(); } if (button2 == checked) { Graphics g = Graphics.FromImage(pictureBox1.Image); g.FillEllipse(Brushes.Red, e.X, e.Y, 10, 10); pictureBox1.Invalidate(); }
Könnt ihr hier meinen Fehler erkennen ?
Ich hätte noch eine kleine Frage dazu: Ich möchte mittels eines TextOut einen Text anhängen genauer gesagt genau den Text des ausgewählten Buttons. Ist das möglich? und wie würde es gehen?
Ich möchte mich schon im voraus für eure Hilfe bedanken: DANKE (;
Antworten
-
Hallo,
dein Code sieht erstmal eher seltsam aus, für das was du bescheibst, was du vor hast.Ich verstehe es so, dass die Buttons eine Art Farbpalette darstellen. Dobald du auf einen drauf klickst, soll die Farbe ausgewählt werden. Abonniere hierzu zunächst das Click-Event von jedem Button und merke dir die zu verwendende Farbe:
Brush brush=Brushes.Black; private void button3_Click(object sender, EventArgs e) { brush = Brushes.Red; } private void button2_Click(object sender, EventArgs e) { brush = Brushes.Blue; } private void button1_Click(object sender, EventArgs e) { brush = Brushes.Green; }
Statt im Click-Handler solltest du direkt im MouseDown/Up-Handler die Ellipsen zeichnen:private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { using (Graphics g = Graphics.FromImage(pictureBox1.Image))//im using-Block um das Graphics auch wieder freizugeben { g.FillEllipse(brush, e.X, e.Y, 10, 10); pictureBox1.Invalidate(); } }
So erhälst du ohne Probleme die Koordinaten des Mausevents.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo,
klar geht das ;)
Füge einfach noch eine string-Variable in die Klasse ein und weise dieser in den Click-Handlern den Text des Buttons zu:Brush brush=Brushes.Black; string sOut=""; private void button3_Click(object sender, EventArgs e) { brush = Brushes.Red; sOut = (sender as Button).Text; }
Dann kannst du mit der DrawString-Methode arbeiten:
//usw.g.FillEllipse(brush, e.X, e.Y, 10, 10); g.DrawString(sOut, new Font("Arial", 16), Brushes.Black, new Point(e.X, e.Y); pictureBox1.Invalidate();
Dort kannst du auch die Schriftart, Schriftfarbe und den Ausgabepunkt angeben. Den Punkt musst du noch entsprechend neben die Punkte schieben.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Lukas96 Dienstag, 11. Februar 2014 19:36
-
Zum aneinander fügen, kannst du den +-Operator verwenden:
sOut = (sender as Button).Text + GetTextFromSelectedRadioButton();
Dadurch werden die Strings aneinander gehangen. Du kannst mit einem weiteren Plus auch noch einen weiteren String ("STRING") dran/dazwischen hängen.Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Lukas96 Dienstag, 11. Februar 2014 19:59
Alle Antworten
-
Hallo,
dein Code sieht erstmal eher seltsam aus, für das was du bescheibst, was du vor hast.Ich verstehe es so, dass die Buttons eine Art Farbpalette darstellen. Dobald du auf einen drauf klickst, soll die Farbe ausgewählt werden. Abonniere hierzu zunächst das Click-Event von jedem Button und merke dir die zu verwendende Farbe:
Brush brush=Brushes.Black; private void button3_Click(object sender, EventArgs e) { brush = Brushes.Red; } private void button2_Click(object sender, EventArgs e) { brush = Brushes.Blue; } private void button1_Click(object sender, EventArgs e) { brush = Brushes.Green; }
Statt im Click-Handler solltest du direkt im MouseDown/Up-Handler die Ellipsen zeichnen:private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { using (Graphics g = Graphics.FromImage(pictureBox1.Image))//im using-Block um das Graphics auch wieder freizugeben { g.FillEllipse(brush, e.X, e.Y, 10, 10); pictureBox1.Invalidate(); } }
So erhälst du ohne Probleme die Koordinaten des Mausevents.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo,
klar geht das ;)
Füge einfach noch eine string-Variable in die Klasse ein und weise dieser in den Click-Handlern den Text des Buttons zu:Brush brush=Brushes.Black; string sOut=""; private void button3_Click(object sender, EventArgs e) { brush = Brushes.Red; sOut = (sender as Button).Text; }
Dann kannst du mit der DrawString-Methode arbeiten:
//usw.g.FillEllipse(brush, e.X, e.Y, 10, 10); g.DrawString(sOut, new Font("Arial", 16), Brushes.Black, new Point(e.X, e.Y); pictureBox1.Invalidate();
Dort kannst du auch die Schriftart, Schriftfarbe und den Ausgabepunkt angeben. Den Punkt musst du noch entsprechend neben die Punkte schieben.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Lukas96 Dienstag, 11. Februar 2014 19:36
-
Ok das mit den Buttons funktioniert super (: danke.
Nur kann ich da auch noch den Text einer RadioButton dazuhängen ? Denn wenn ich schreibe:
sOut = (sender as Button).Text;
sOut = GetTextFromSelectedRadioButton();Dann gibt er mir imme rnur den Text von der RadioButton aus und nicht mehr von dem Button.
-
Zum aneinander fügen, kannst du den +-Operator verwenden:
sOut = (sender as Button).Text + GetTextFromSelectedRadioButton();
Dadurch werden die Strings aneinander gehangen. Du kannst mit einem weiteren Plus auch noch einen weiteren String ("STRING") dran/dazwischen hängen.Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort markiert Lukas96 Dienstag, 11. Februar 2014 19:59
-
Hat super funktioniert danke.
Tut mir leid für das nervige fragen aber ich habe mich mit den PictureBoxen einfach viel zu wenig beschäftigt und kenn mich mit C# noch zu wenig aus. Habe bis jetz nur C++ programmiert und auf dem Borland Builder Windows Forms Anwendungen.
Aber eine Frage hätte ich noch: Ich möchte mit zwei Buttons die Bilder wechseln können so 3 bis 6 Bilder. Also mit dem Next Button in die eine Richtung und mit dem anderen Button (previous) in die andere Richtung wechseln.?
Und eines was wichtig ist, ist dass sich die Punkt nach denen ich vorher gefragt habe dass die ja nicht gelöscht werden beim weiterschalten. Die sollten immer am gleichen Platz bleiben. Ist das möglich?
-
Tut mir leid für das nervige fragen
Dafür sind Foren da ;)
Aber eine Frage hätte ich noch
Da das Thematisch eine neue Frage ist, passt das besser in einen neuen Thread. So bleibt die Übersicht gewahrt.
Aber machen wir mal eine kleine Ausnahmen.
Du kannst im Codebehind eine Liste und eine int-Variable anlegen. Die Liste enthält die verschiedenen Bilder und die int-Variable den Indes des aktuellen Bildes.
Du das verändern des Index', setrzt du dann das Bild neu:List<Image> imgs = new List<Image>();//Einfch mit .Add() ein neues Bild hinzufügen int index = 0; void btnPrevious_Click(object sender, EventArgs e) { --index; if(index < 0) index = imgs.Count - 1;//Ans Ende scrollen pictureBox1.Image = imgs[index];//Neues Bild ausgeben } void btnNext_Click(object sender, EventArgs e) { ++index; if(index >= imgs.Count) index = 0;//An den Anfang scrollen pictureBox1.Image = imgs[index];//Neues Bild ausgeben }
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Danke zuerst mal für die Ausnahme.
Der Code funktioniert aber nicht ganz. Denn wenn ich diese Zeilen in die zwei Buttons einschreibe und die Bilder in die Resource hineinspeichere und einen der Buttons anklicke bekomme ich einen Fehler.
Habe ich da noch irgendwo einen Fehler gemacht ?
-
Wenn irgend etwas nicht geht, dann poste bitte immer den StackTrace, sowie die Art der Fehlermeldung.
Das einzige was ich mir vorstellen kann ist, dass du keine Bilder zur Liste hinzugefügt hast:
imgs.Add(new Bitmap (@"D:\test\bmp - Kopie.bmp")); imgs.Add(new Bitmap (@"D:\test\bmp.bmp")); imgs.Add(new Bitmap (@"D:\test\test2.png"));
Denn ohne das würden keine Bilder in der Liste sein und somit kann man auch keine auslesen.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Ok ich habe das jetz so probiert wie du gesagt hast. Nur wenn ich die Anwendung ausführe und auf einen der Buttons klicke springt er mir in den Wuellcode an die diese Zeile:
pictureBox1.Image = imgs[index];
und gibt mir diesen Fehler aus:
ArgumentOutOfRangeException wurde nicht behandelt.
Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
Parametername: indexFalls es wichtig zur Fehleranalyse ist ich habe den Dateipfad der Bilder in jedem Button eingegeben ich hoffe das war richtig so.
-
Du musst die Bilder zu imgs hinzufügen, siehe die Antwort oben. Du erstellst Instanzen von Bitmap und übergibst diesen den Pfad zu den Bildern. (Oder erstellst die Bitmaps auf eine andere Art und Weise)
Das hinzufügen muss noch vor dem ersten Button-Click erfolgen. Entweder im Konstruktor nach InitialisizeComponent oder im Load-Ereignis der Form.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Ok das hab ich jetz verstanden. Nur wenn ich nach InitialisizeComponent das mit .Add mache
List<Image> imgs = new List<Image>();//Einfch mit .Add() ein neues Bild hinzufügen imgs.Add(new Bitmap(@"C:\Users\Public\Pictures\Sample Pictures\Chrysantheme.jpg")); int index = 0;
dann bekomme ich ein paar Fehler und zwar:
- Ungültiges Token "(" in Klasse, Struktur oder Schnittstellenmemberdeklaration.
- Die Methode muss einen Rückgabetyp besitzen.
- Typ erwartet.
- "WindowsFormsApplication1.Form1.imgs" ist ein(e) "Feld", wird aber wie ein(e) "Typ" verwendet.
Ich weis ich nerv ein wenig aber das leuchtet mir gerade nicht ganz ein.
- Ungültiges Token "(" in Klasse, Struktur oder Schnittstellenmemberdeklaration.
-
Nochmal...
die Deklaration von imgs und index muss in die Klasse, das Add in den Konstruktor.class Form1 : Form { public Form1()//Konstruktor { InitialisizeComponent();//Controls erstellen img.Add(...);//Bilder hinzufügen } //Nachfolgend die Variablen deklaration List<Image> imgs = new List<Image>(); int index = 0;
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Danke Danke fürs erklären und für die Geduld.
Nur habe ich schon wieder den Fehler:
ArgumentOutOfRangeException wurde nicht behandelt.
Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
Parametername: indexUnd dieser Fehler kam hinzu:
ArgumentException wurde nicht behandelt.
Ungültige Parameter.Ich habe es jetz ganz genau so gemacht wie du gesagt hast:
public partial class Form1 : Form { public Form1() { InitializeComponent(); imgs.Add(new Bitmap(@"C:\Users\Public\Pictures\Sample Pictures\Chrysantheme.jpg")); imgs.Add(new Bitmap(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg")); imgs.Add(new Bitmap(@"C:\Users\Public\Pictures\Sample Pictures\Jellyfish.jpg")); } List<Image> imgs = new List<Image>(); int index = 0; private void button19_Click(object sender, EventArgs e) { ++index; if (index >= imgs.Count) index = 0; pictureBox1.Image = imgs[index]; } private void button20_Click(object sender, EventArgs e) { --index; if (index < 0) index = imgs.Count - 1; pictureBox1.Image = imgs[index]; }