Entwickler-Ecke

WinForms - In einem Formular zeichnen und erst dann modal anzeigen


RalphHoffmann - Di 08.09.15 14:27
Titel: In einem Formular zeichnen und erst dann modal anzeigen
Hallo und guten Tag @ all :D

Ich erstelle mit folgendem Code ein Formular, dem ich ein paar Eigenschaften mitgebe. Zuletzt will ich zeichnen und dann das Formular modal anzeigen lassen. Es erscheint jedoch kein gefülltes Rechteck? Warum? Ich lasse die Ausführung des Codes (da gehört noch mehr dazu) in dieser Methode stoppen und gehe in Einzelschritten weiter. Dort sehe ich dann, dass die Zeichenfläche besorgt wird und auch, dass der 'musterPinsel' definiert ist.


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:
private void infoToolStripMenuItem_Click(object sender, EventArgs e)
{
//Eine Instanz des Infoforms anlegen
Form frmInfo = new Form();

//Formular Einstellungen anpassen
frmInfo.FormBorderStyle = FormBorderStyle.Fixed3D;
frmInfo.MaximizeBox = false;
frmInfo.MinimizeBox = false;
frmInfo.Text = "Stil - Info";

//Zeichenfläche besorgen
Graphics zfInfo;
zfInfo = frmInfo.CreateGraphics();

//Rechteck mit aktueller Füllung/aktuellem Muster zeichnen            
zfInfo.FillRectangle(musterPinsel,10,10,10,10);

//Formular anzeigen
frmInfo.ShowDialog();

...
}


Gruß
Ralph

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


Ralf Jansen - Di 08.09.15 14:40

Die Oberfläche wird regelmäßig neu gezeichnet mit dem was das Control definiert und/oder das was du im OnPaint Ereignis hinzufügst.
ShowDialog löst ein erstes zeichnen aus und in diesem Zeichnen ist dein FillRectangle nicht enthalten da es nicht in OnPaint stattfindet.

Zeichnen auf ein Control ist keine einmalige dauerhafte Sache. Die Fläche eines Controls mußt du jedesmal zeichnen/neuzeichnen wenn diese Fläche ungültig wird (warum das auch immer passiert ist). Einmal irgendwas auf die Fläche zeichnen und hoffen das das bei jeder Änderung verwahrt wird funktioniert nicht. Du mußt das zeichnen vom OnPaint Ereignis aus erledigen. Wenn das aus irgendeinem Grund zu lange dauert weil sehr komplex oder so dann kannst du das was du da zeichnest zuerst in irgendein Bitmap zeichnen und dann in OnPaint in das Graphics Object kopieren (per DrawImage z.B.).


RalphHoffmann - Di 08.09.15 17:17

Hallo Ralf,

danke für Deine Hilfe. Ich habe parallel auch weiter gegoogelt und inzwischen gleiche Infos gefunden :!: :D

Werde ich mich jetzt mal mit diesem OnPaint auseinander setzen.

Gruß
Ralph


Th69 - Di 08.09.15 17:30

Hallo,

s.a. den Link unter Grafiken: was mache ich falsch? [http://www.entwickler-ecke.de/viewtopic.php?p=623150#623150]