Autor |
Beitrag |
Talemantros
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Sa 23.11.13 00:36
Hallo zusammen,
ich habe ein Feld
C#-Quelltext
Dieses wird im Laufe des Programms mit diversen .Width etc und Farbe verändert.
An einem Button möchte ich in einem neuen Form den aktuellen Zustand anzeigen lassen
Dazu rufe ich ein neues Form auf und wollte unter anderem den Stift überegben
C#-Quelltext 1: 2: 3: 4: 5:
| private void tsm_info_Click(object sender, EventArgs e) { Info infoFenster = new Info(stift,pinsel,musterPinsel); infoFenster.Show(); } |
Und nun wollte ich im Konstruktor des neuen Form diese Angaben verarbeiten und eine Linie im aktuellen Zustand übergeben
Dazu habe ich eine PictureBox als Zeichenfläche gewählt.
Leider zeigt er nichts an, aber auch keinen Fehler
weiß nicht mehr weiter und würde mich über einen lösungsansatz freuen
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| namespace Zeichnen_neu { public partial class Info : Form { Graphics infoZeichenflaeche; public Info(Pen infoStift, SolidBrush infoPinsel, System.Drawing.Drawing2D.HatchBrush infoMusterPinsel) { InitializeComponent();
infoZeichenflaeche = pb_info.CreateGraphics();
infoZeichenflaeche.DrawLine(infoStift, new Point(10,10),new Point 10,50)); } } } |
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Sa 23.11.13 00:43
Du must im Paint Event des Form zeichnen. Wenn du an anderer Stelle zeichnest geht das ins nichts oder es ist zumindest sofort wieder weg wenn ein neuzeichnen der Form ansteht(dabei wird Paint ausgelöst und wenn du da nicht deine Linie zeichnest existiert die danach auch nicht mehr da eben nicht gezeichnet).
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 23.11.13 00:44
Zusätzlich zu dem, was Ralf sagte: Du brauchst auch noch eine parameterlosen Konstruktor, wenn der Designer im Visual Studio weiterhin funktionieren soll.
Stimmt nicht, wie Ralf richtig anmerkt.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Zuletzt bearbeitet von Christian S. am Sa 23.11.13 15:07, insgesamt 1-mal bearbeitet
|
|
Talemantros 
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Sa 23.11.13 00:56
Hi,
also das mit dem Paint habe ich versucht, aber leider kennt er dann mein übergebenes Feld nicht mehr
Und die Antwort von Christian verstehe ich leider nicht
Sorry
lg
Edit:
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:
| namespace Zeichnen_neu { public partial class Info : Form { Graphics infoZeichenflaeche; public Info(Pen infoStift, SolidBrush infoPinsel, System.Drawing.Drawing2D.HatchBrush infoMusterPinsel) { InitializeComponent(); } public Info() {
}
private void pb_info_Paint(object sender, PaintEventArgs e) { infoZeichenflaeche = pb_info.CreateGraphics();
infoZeichenflaeche.DrawLine(infoStift, new Point(10, 10), new Point(10, 50)); } } } |
So, als grobe Richtung?
Edit2:
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:
| namespace Zeichnen_neu { public partial class Info : Form { Graphics infoZeichenflaeche;
Pen neuStift; public Info(Pen infoStift, SolidBrush infoPinsel, System.Drawing.Drawing2D.HatchBrush infoMusterPinsel) { InitializeComponent(); neuStift = (Pen)infoStift.Clone(); }
public Info() {
}
private void pb_info_Paint(object sender, PaintEventArgs e) { infoZeichenflaeche = pb_info.CreateGraphics();
infoZeichenflaeche.DrawLine(neuStift, new Point(10, 10), new Point(10, 50)); } } } |
Habe es jetzt noch mit einem Feld versucht in das ich in dem Konstruktor den übergebenen Wert clone.
Leider wieder ohne Erfolg.
Vermutlich wie immer eine Kleinigkeit, die ich nicht verstehe.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Sa 23.11.13 01:14
In e den EventArgs steckt schon ein Graphics Object. Es hilft nicht ein neues zu erzeugen.
Hängt dein Event an einer PaintBox auf der Form (der pb Präfix läßt das vermuten) oder an der Form?
Edit:
Zitat: | Und die Antwort von Christian verstehe ich leider nicht |
Er meint das dir der Standardkonstruktor fehlte. Also dieser
wie in deinem jetzt gezeigten Code. Damit der Winforms Designer die Form zum designen in Visual Studio auch zum designen anzeigen kann. Das ist aber so nicht richtig. Der Vorfahr der zu designen Form braucht den den die wird vom Designer instanziiert und die InitializeComponent Methode der eigentlichen Form quasi manuell ausgeführt. Wenn die zu designende Form instanziiert werden würde wäre das ein Problem den die ist ja während dem designen vermutlichlich meist nicht kompilierbar und jede Änderung müsste jedesmal zu einem direkten neukompilieren und neuinstanziieren führen. Den Hinweis kannst du also ignorieren außer du willst nochmal von Info ableiten.
|
|
Talemantros 
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Sa 23.11.13 01:41
Bei mir heißt das Steuerelemt nicht Paintbox, sondern PictureBox?!
Vermutlich aber dasselbe, da ich eine Paintbox so erst mal nicht finde.
Leider steige ich noch nicht dahinter.
|
|
Talemantros 
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Sa 23.11.13 11:12
Guten Morgen zusammen,
also ich habe jetzt mal eine Messagebox ausgeben lassen im Konstruktor des InfoFensters mit dem übergebenen Wert infoStift.Width
Das funktioniert. Die Übergabe ist als nicht mein Problem.
Verstehe gerade nur nicht wie ich in der PaintMethode darauf zugreifen kann.
Vielen Dank schonmal für die Hilfe
Viele Grüße
EDIT:
Juhu er zeichnet!!!
Jetzt nur noch mal meine Frage, ob dies eine gute Lösung ist, oder eher schlechten Programmierstil beinhaltet?!
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| namespace Zeichnen_neu { public partial class Info : Form { Pen neuStift; public Info(Pen infoStift, SolidBrush infoPinsel, System.Drawing.Drawing2D.HatchBrush infoMusterPinsel) { InitializeComponent(); neuStift = (Pen)infoStift.Clone(); }
private void pb_info_Paint(object sender, PaintEventArgs e) {
e.Graphics.DrawLine(neuStift, new Point(10, 10), new Point(10, 50)); } } } |
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 23.11.13 12:07
 Stimmt, das mit dem parameterlosen Konstruktor braucht man bei Forms nicht. Muss ich wohl irgendwie mit den UserControls verwechselt haben. War ja schon spät 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Sa 23.11.13 14:40
Zitat: | Bei mir heißt das Steuerelemt nicht Paintbox, sondern PictureBox?! |
Hab ich durcheinandergeworfen. Sorry.
Du brauchst doch nur eine Oberfläche auf der du zeichnen kannst? Da ist PictureBox, wenn du nichts von den Fähigkeiten der PictureBox brauchst, glaube ich ein wenig übertrieben. Ein Panel würde da reichen.
Und das geclonte Pen Object solltest du dann wenn du es nicht mehr brauchst auch wieder disposen. Z.B. im disposed Event der Form.
|
|