Entwickler-Ecke
WinForms - Bild Laden
C# Neuling - Fr 19.03.10 14:24
Titel: Bild Laden
Hallo zusammen,
Ich bin neu hier und zudem anfänger was C# betrifft. Ich habe folgendes Problem:
Aufgabenstellung ist mithilfe eines Buttons ein Bild in die Form zu laden, ohne PictureBox. Dabei soll es möglich sein den Pfad zu einem anderen Bild in ein Texfeld zu schreiben und mit klick auf den Button sollte das neue Bild geladen werden und das alte gelöscht. Zudem sollte es möglich sein die Formgröße zu ändern ohne dass sich die seitenverhältnisse des bildes ändern.
Alles soweit kein Problem. Nur passiert nach dem erstmaligen Laden eines Bildes folgendes:
Das erste bild wurde nach einem Klick erfolgreich geladen. Nach ändern des Pfades zu einer anderen Datei wird jedoch das neue Bild schon alleine durch das berühren des Buttons mit der Maus(ohne zu klicken) geladen das alte jedoch nicht gelöscht. Nach dem Klick erfolgt dann das löschen des alten Bildes. Ich vermute dass dies daran liegt dass sobalt ich den Button berühre, der dann eine andere Rahmenfarbe bekommt, das Paintereignis ausgelöst wird, da das Steuerelement neu gezeichnet wird.
Gibt es irgendeine möglichkeit den Button so einzustellen dass er nicht allein durch berühren der Maus verändert wird und somit das Paintereignis nicht aufgerufen wird?
Vorab schon mal vielen dank für eure Hilfe
Mit freundlichen Grüßen
C# Neuling
Nemag - Fr 19.03.10 14:40
Ich schätze jetzt mal du wertes das verkehrte Ereignis aus.
Der Button hat ein Click-Event, dies ist genau das welches du nehmen solltest. (Nicht MouseClick, MouseHover oder sowas)
Was machst du denn eigentlich mit dem Paint-Ereignis? Ich hoffe du hast das Bild einfach der Form als BackGroundImage mitgegeben (BackGroundImageLayout = Center) oder zeichnest du das irgendwie selbst?
C# Neuling - Fr 19.03.10 14:47
Nein Leider habe ich genau das "click" event genommen nicht MouseClick.
Aber trozdem danke.
Moderiert von
Christian S.: Beiträge zusammengefasst
Hatte ich zu beginn mit dem BackGroundImage. Aber leider darf ich das nicht verwenden (Anweisung des Lehrers :()
Das ganze ist ein Schulprojekt deshalb muss ich mich da dran halten.
Komischerweise hat es in der schule auch problemlos geklappt nur sobalt ich das gleiche Programm zuhause geöffnet hatte war dieser Fehler da.
Also ja ich zeichne selber :)
danielf - Fr 19.03.10 15:01
Vielleicht zeigst du mal ein bisschen Code. Der ist nämlich eindeutig. Manchmal ist es ein Unterschied was man machen will und was der Code macht ;)
Du könntest es vlt. umgehen, wenn du nicht bei jedem Paint das Bild aus der Datei lädst, sondern dies nur beim Button click machst:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| OnPaint( ...) { e.DrawImage(image); }
ButtonClick() { image = Bitmap.FromFile(imagePFad); } |
Gruß
C# Neuling - Fr 19.03.10 15:36
Aber nicht auslachen :)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| public partial class MainForm : Form { float FaktorB, FaktorH, Faktor; bool freigabe = false; public MainForm() { InitializeComponent(); txt_pfad.Text = "C:\\Dokumente und Einstellungen\\Administrator\\Desktop\\ET4\\bild\\Labrador.jpg"; this.ResizeRedraw = true; }
private void btn_bild2_Click(object sender, EventArgs e) { this.Invalidate(); freigabe = true; } void MainFormPaint(object sender, PaintEventArgs e) { if (freigabe == true) BildLaden(); } void BildLaden() { Graphics bild = this.CreateGraphics(); bild.PageUnit = GraphicsUnit.Pixel; try { Image img = Image.FromFile(txt_pfad.Text); txt_form_h.Text = Convert.ToString(img.Size.Height); txt_format_b.Text = Convert.ToString(img.Size.Width); FaktorB = img.Size.Width / (float)(this.Size.Width); FaktorH = img.Size.Height / (float)(this.Size.Height); if (FaktorB >= FaktorH) Faktor = FaktorB; else Faktor = FaktorH; if (Faktor < 1) Faktor = 1; bild.DrawImage(img, new Rectangle(5, 50, (int)(img.Size.Width / Faktor - 80), (int)(img.Size.Height / Faktor - 80))); } catch { MessageBox.Show("Datei oder Pfad ungültig"); } |
Moderiert von
Christian S.: Quote- durch C#-Tags ersetzt
Christian S. - Fr 19.03.10 16:39
Hallo!
Ich denke, das Problem lässt sich lösen, wenn Du das Bild nicht bei jedem Neuzeichnen von der Platte lädst (was ja irgendwo Quatsch ist), sondern nur einmal beim Klick auf den Button. Das dürfte alles deutlich beschleunigen und außerdem Dein Problem lösen.
Grüße
Christian
//Edit: Zeichnen dann weiterhin in der Paint-Methode.
C# Neuling - Fr 19.03.10 16:47
Und wie stelle ich das an dass ich das nichtmehr von der Platte laden muss?
Achso verstanden danke ich probiers mal aus
danielf - Fr 19.03.10 16:49
Das kannst du nicht verhindern :) Er meint nur noch einmal von der Platte laden. (Die gleiche Idee wie ich auch schon geschildert habe).
Da steht eigentlich "alles" ;)
Christian S. - Fr 19.03.10 16:49
Du musst img zu einem Feld Deiner Klasse machen, damit Du es in der Click-Methode füllen kannst und in der Paint-Methode dann den Inhalt nur noch benutzt.
C# Neuling - Fr 19.03.10 16:53
Ja war grade etwas zu langsam beim zweiten mal durchlesen der Antwort hats dann klick gemacht wie gesagt ich probiers mal aus
C# Neuling - Fr 19.03.10 17:08
Also ich bekomm das nicht ganz hin es heist immer das image im aktuellen kontext nicht vorhanden ist. Ich kenn mich mit dem Klassenzeug noch nicht so recht aus. Wie soll das denn klappen? Gibts sowas wie einen Image Datentyp dass ich ne Variable so deklariren kann oder wie soll das gehen?
C# Neuling - Fr 19.03.10 17:20
Ha ich habs danke jungs echt gute und schnelle Hilfe.
Ich stell gleich mal mein gesamten Quelltext rein dann könnt ihrs euch nochmal anschaun.
Vielen Dank nochmal
C# Neuling - Fr 19.03.10 17:29
Hier der gesamte Quelltext
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
| using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;
namespace Wackershauser_et4 { public partial class MainForm : Form { float FaktorB, FaktorH, Faktor; bool freigabe = false; Image img; public MainForm() { InitializeComponent(); txt_pfad.Text = "C:\\Dokumente und Einstellungen\\Administrator\\Desktop\\ET4\\bild\\smurf.jpg"; }
private void btn_bild2_Click(object sender, EventArgs e) { this.ResizeRedraw = true; this.Invalidate(); try { img = Image.FromFile(txt_pfad.Text); } catch { MessageBox.Show("Datei oder Pfad ungültig"); } freigabe = true; } void MainFormPaint(object sender, PaintEventArgs e) { if (freigabe == true) BildLaden(); } void BildLaden() { Graphics bild = this.CreateGraphics(); bild.PageUnit = GraphicsUnit.Pixel; txt_form_h.Text = Convert.ToString(img.Size.Height); txt_format_b.Text = Convert.ToString(img.Size.Width); FaktorB = img.Size.Width / (float)(this.Size.Width); FaktorH = img.Size.Height / (float)(this.Size.Height); if (FaktorB >= FaktorH) Faktor = FaktorB; else Faktor = FaktorH; if (Faktor < 1) Faktor = 1; bild.DrawImage(img, new Rectangle(5, 50, (int)(img.Size.Width / Faktor - 80), (int)(img.Size.Height / Faktor - 80))); } } } |
Christian S. - Fr 19.03.10 18:29
Also erst einmal würde ich gucken, dass die Einrückung stimmt.
Die Variable freigabe brauchst Du nicht, Du kannst ja jetzt einfach prüfen, ob in img was drin steht.
Convert.ToString würde ich dadurch ersetzen, dass Du die ToString-Methode der entsprechenden Variable aufrufst.
C# Neuling - Sa 20.03.10 22:31
Hm, ok aber wie stelle ich das an ich kenne die Befehle dafür nicht. Wie gesagt ich bin noch blutiger Anfänger.
Christian S. - Sa 20.03.10 22:38
C# Neuling hat folgendes geschrieben : |
Hm, ok aber wie stelle ich das an |
Was?
C# Neuling - So 21.03.10 13:41
Christian S. hat folgendes geschrieben : |
Also erst einmal würde ich gucken, dass die Einrückung stimmt.
Die Variable freigabe brauchst Du nicht, Du kannst ja jetzt einfach prüfen, ob in img was drin steht.
Convert.ToString würde ich dadurch ersetzen, dass Du die ToString-Methode der entsprechenden Variable aufrufst. |
Naja Also ich weis nicht was eine ToString-Methode ist und wie ich diese aufrufe, und ich weis auch nicht wie ich prüfe ob in img was drinsteht dafür kenne ich keinen Bafehl ich kenn mich mit diesem Datentyp überhaupt nicht aus.
Es tut mir keid wenn ich eure zeit mit sowas verschwende aber ich bin nun mal noch anfänger und unser Lehrer hat uns bisher die Klassen nicht erklärt geschweigedenn von irgendwelchen methoden gesprochen er wusste noch nichtmla das es sowas wie trypharse gibt bis ich ihn darauf aufmerksam gemacht habe. Also erwartet nicht zuviel von mir :(
Also wenn mir da jemand ein kleines beispiel zeigen könnte wäre echt super.
Vielen dank im vorraus.
Christian S. - So 21.03.10 14:10
C# Neuling hat folgendes geschrieben : |
Naja Also ich weis nicht was eine ToString-Methode ist und wie ich diese aufrufe, |
Alles in .NET hat eine
ToString-Methode, weil sie in der
Object-Klasse (also der Basisklasse für alles) implementiert ist. Generell ist Zweck, eine String-Repräsentation zu liefern. Viele Klassen überschreiben diese Methode, damit sie einen sinnvolleren Wert zurückliefert, so liefert die
ToString-Methode bei einem
int z.B. den Zahlenwert als String zurück. Aufrufen tust Du die Methode wie jede andere Methode auch.
C# Neuling hat folgendes geschrieben : |
und ich weis auch nicht wie ich prüfe ob in img was drinsteht dafür kenne ich keinen Bafehl ich kenn mich mit diesem Datentyp überhaupt nicht aus. |
Das kannst Du bei jedem Referenzdatentypen (also z.B. Klassen) prüfen, indem Du schaust, ob die Variable
null ist.
C# Neuling hat folgendes geschrieben : |
Es tut mir keid wenn ich eure zeit mit sowas verschwende |
Tust Du nicht, aber mit Deiner vorherigen Beschreibung, wo Du nicht weiter kommst, konnte ich halt nichts anfangen ;-)
C# Neuling - So 21.03.10 15:53
Hm, ok also das mit der freigabe Variable hab ich jetzt aber das mit der methode hab ich immernoch nicht ganz verstanden.
Ist mit Methode ein Unterprogramm gemeint sowas wie eine selbst geschriebene Funktion (bin da bischen BASIC geschädigt) also sowas in der art?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| using Systen; public class Addieren { public static int Main(string[] Argumente) { int a, b; a = Int32.Parse(Argumente[0]); b = Int32.Parse(Argumente[1]); return a + b; } } |
Falls es das ist weis ich nur nicht wie ich das auf mein Programm übernehmen soll.
Hm hab nochmal was anderes Probiert, die ToString Methode ist denke ich schon vorgefertigt also einfach nur ToString() eingeben. Hab das mal wie folgt ausprobiert:
C#-Quelltext
1:
| txt_breite.Text = ToString(img.Size.Width); |
Nun gibt er mir aber folgenden fehler aus:
Keine Überladung für die ToString-Methode nimmt 1 Argumente an. (CS1501)
Und was hat der nun zu bedeuten????
Danke schon mal
Hey so funktionierts:
C#-Quelltext
1:
| txt_breite.Text = img.Size.Width.ToString(); |
Ist das so auch korrekt geschrieben oder war das jetzt zufall???
C# Neuling - So 21.03.10 16:12
Hätte da mal noch ne frage, wollte das ganze mal bischen weiterspinnen und hab mich gefragt wie das zu lösen ist dass ich mit einem Klick quasi durch die ganzen bilder in dem Ordner schalten kann. Also so wie bei der Windows Bild- und Faxanzeige. Dazu muss ich doch irgendwie den Inhalt eines Ordners Lesen wie macht man sowas denn??? Aber das ist jetzt nur mal so zweitrangig.
JüTho - So 21.03.10 17:09
C# Neuling hat folgendes geschrieben : |
Ist mit Methode ein Unterprogramm gemeint sowas wie eine selbst geschriebene Funktion |
Mit "Methode" ist bei C# das gemeint, was in anderen Programmiersprachen als Funktion oder Prozedur unterschieden wird. Es handelt sich um eine Routine, die von irgendwoher aufgerufen wird (mit oder ohne Parameter/Argumente), die etwas ausführt und danach etwas (z.B. einen int) oder auch nichts (void) als Ergebnis zurückliefert.
In deinem letzten Beitrag gibt es (als deine Definition) nur die Methode
Main sowie (als Benutzung einer vorhandenen Methode durch dich) die
ToString-Methode für int.
C# Neuling hat folgendes geschrieben : |
Hey so funktionierts:
C#-Quelltext 1:
| txt_breite.Text = img.Size.Width.ToString(); |
Ist das so auch korrekt geschrieben oder war das jetzt zufall??? |
Genauso ist es gemeint. In der gleichen Weise kannst du von jedem Objekt mit ToString eine String-Darstellung erhalten (es liefert nur nicht in allen Fällen eine nützliche Information), wie Christian schon geschrieben hatte.
Du solltest dich zielgerichtet in C# einarbeiten, z.B. durch
OpenBook VC# [
http://openbook.galileocomputing.de/visual_csharp/index.htm].
Gruß Jürgen
C# Neuling - So 21.03.10 18:13
Alles klar danke dann mach ich das mal :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!