Autor |
Beitrag |
C# Neuling
Hält's aus hier
Beiträge: 13
|
Verfasst: Fr 19.03.10 14:24
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
      
Beiträge: 132
Erhaltene Danke: 2
|
Verfasst: 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: Fr 19.03.10 15:36
Aber nicht auslachen  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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
C# Neuling 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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
Zuletzt bearbeitet von C# Neuling am Fr 19.03.10 16:51, insgesamt 1-mal bearbeitet
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
C# Neuling 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: Fr 19.03.10 17:29
Hier der gesamte 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
C# Neuling 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 20.03.10 22:38
C# Neuling hat folgendes geschrieben : | Hm, ok aber wie stelle ich das an |
Was?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
C# Neuling 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
C# Neuling 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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.
|
|