Autor |
Beitrag |
blutengel
      
Beiträge: 59
Win XP, WIN 7
VS#2008 Prof
|
Verfasst: Fr 20.08.10 09:22
Hallo und Guten Morgen!
Ich habe da mal ein ein Problem.Und Zwar wird fogender Code ausgeführt wenn ich eine Button drücke
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Graphics g = CreateGraphics();
Color schwarz = new Color(); schwarz = Color.FromArgb(0,0,0);
Pen pen_schwarz = new Pen(schwarz,3);
g.DrawRectangle(pen_schwarz, 40, 40, 40, 40); |
Soweit so gut.Diese paar Zeilen zeichnen mir in meine Form 1 ein Rechteck. Was ich jetzt gerne wissen möchte ist, wie mache ich es das diese 5 Zeilen direkt nacht Start des Programms ausgeführt werden? Ich habe schon versucht es in die Form 1 Methode zu schreiben aber da tut sich gar nichts! Bin ich da völlig falsch oder ist der ansatz richtig?
MFG
blutengel
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Fr 20.08.10 09:34
Beim Erstellen der Instanz ist das Form ja noch nicht gezeichnet, dementsprechend zeichnest du ins leere.
Aboniere das Paint-Event und zeichne darin. (dann wird es auch bei jedem Repainting wieder gemacht, z.B. wenn du das Form minimierst und wieder hochholst)
|
|
blutengel 
      
Beiträge: 59
Win XP, WIN 7
VS#2008 Prof
|
Verfasst: Fr 20.08.10 09:45
Das ist ja schon mal Logisch. Bin auch noch nicht lange dabei.Wie meinst du das mit dem Abonieren höre es hHeute zum ersten mal.
MFG
blutengel
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Fr 20.08.10 10:19
Paint ist ja ein Event, da kannste dich ranhängen und eigene Funktionalität ausführenlassen.
(gleiches Prinzip wie beim Button wenn er geklickt wird, also das Click-Event)
Du kannst das entweder vom Designer aus machen oder direkt selbst. Im Designer gehst du einfach auf die Form dann zu den Events (neben den Eigenschaften) und machst nen Doppelklick auf Paint.
Oder halt die manuelle Variante:
C#-Quelltext 1:
| this.Paint += new System.Windows.Forms.PaintEventHandler(deinDelegat); |
|
|
blutengel 
      
Beiträge: 59
Win XP, WIN 7
VS#2008 Prof
|
Verfasst: Fr 20.08.10 11:03
Wenn ich jetzt meine 5 Zeilen Code in die Neue Method packe funktionierts.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = CreateGraphics();
Color schwarz = new Color(); schwarz = Color.FromArgb(0, 0, 0);
Pen pen_schwarz = new Pen(schwarz, 3);
g.DrawRectangle(pen_schwarz, 40, 40, trackBar1.Value, trackBar1.Value); } |
Nach straten des Programms wird mein Rectangle sofort gezeichnet.
Jetzt habe ich zusätzlich eine Trackbar womit ich die größe verändern möchte.Muss ich dann nach jeder Änderung des Trackbar wertes die Methode aufrufen um neu zu Zeichnen?Und wenn ja was muss ich für pARAMETER ÜBERGEBENß
mfg
BLUTENGEL
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 20.08.10 13:07
Der Paint Event wird automatisch vom Framework aufgerufen den musst du nie selbst aufrufen. Gilt normalerweise für jede andere Eventmethode auch. Es kann natürlich sein das das Framework nicht mitbekommt bzw. mitbekommen kann das etwas neu zu zeichnen ist. Das kannst du die Invalidate() Methode aufrufen um der Form mitzuteilen das der Inhalt ungültig ist und neu gezeichnet werden muss.
In den PaintEventArgs steckt übrigens bereits eine gültiges Graphics Instanz die du direkt benutzen kannst (e.Graphics). Es gibt keinen Grund mit CreateGraphics eine neue zu erzeugen.
|
|
blutengel 
      
Beiträge: 59
Win XP, WIN 7
VS#2008 Prof
|
Verfasst: Fr 20.08.10 14:07
Ich habe Invalidated(); jetzt mal direkt so eingebaut.Jetzt lässt sich auch die größe mit der Trackbar ändern, aber jetzt ist alles am Flackern.Muss ich dem denn sagen bei was für eine Änderung er das Element für ungültig erklären soll?
MFG
blutengel
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Fr 20.08.10 14:10
Ähm wo hast du das Invalidatedaufgerufen? (Ich hoffe nicht in der Funktion wo es gezeichnet wird, sonst hast du ne schöne Endlosschleife produziert)
|
|
Th69
      

Beiträge: 4799
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 20.08.10 14:53
Benutze statt direkt auf der Form zu zeichnen ein Panel und rufe dann nur für dieses Panel Invalidate() auf.
Alternativ könntest du bei dieser Methode auch einen Bereich (Rectangle) angeben, der neu gezeichnet werden soll.
Einen guten Artikel zum Zeichnen in WinForms findest du hier: www.mycsharp.de/wbb2...d.php?threadid=21782
|
|
blutengel 
      
Beiträge: 59
Win XP, WIN 7
VS#2008 Prof
|
Verfasst: Sa 21.08.10 00:28
Doch hatte ich in der Funktion wo es gezeichnet wird aufgerufen.Leider kommme ich immer noch nicht weiter.Wie sieht es denn mit Trackbar1.Valuechanged aus? Reicht es nicht wenn eine Änderung des Trackbarvalues das Invalidate aufruft.Bin schon am verzweifeln.
@TH69:
Deine Methode werd ich demnächst auch mal ausprobieren aber erstmal muss ich es direkt auf der Form hinbekommen.
MFG
blutengel
|
|
Th69
      

Beiträge: 4799
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Sa 21.08.10 09:33
Ja, so wie du es beschrieben hast ist es richtig, also Invalidate im ValueChanged-Ereignis aufrufen. Und wegen dem Beseitigen des Flackerns lautet das Stichwort 'DoubleBuffering'.
Bei dir reicht ersteinmal (im Konstruktor deiner Form:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| MainForm() { InitializeComponents();
DoubleBuffered = true; } |
zu setzen.
Für andere Controls mußt du einen anderen Weg gehen, da die Eigenschaft 'DoubleBuffered' protected ist, s. www.mycsharp.de/wbb2...d.php?threadid=59980
|
|