2016-06-13 11 views
0

Ich versuche, diese C++ MFC-Anwendung in eine C# WinForm zu portieren. Es ist ein work in progress. Grundsätzlich möchte ich eine Zeichnung in den groupbox Bereich tun:Verwenden von WinForm Paint-Ereignis in Groupbox

Dialog design

ich einen Lack-Handler dem Formular hinzugefügt, meine Arbeit zu tun:

private void FullColourPaletteForm_Paint(object sender, PaintEventArgs e) 
{ 
    // Do painting with e.Graphics 
} 

Ich war überrascht zu sehen, dass es tat Zeige mein Rendering nicht. Aber dann erkannte ich, dass in einem Winform es nicht groupbox, sondern ein container genannt wird. So habe ich den Behälter unsichtbar zu sein und verständlicherweise meinen Rendering (wenn auch nicht ganz richtig) war jetzt visble:

Dialog results

Wie soll ich meine Malerei im Bereich des Behälters tun?

Warum ist das dann? Alles, was ich tat, war hinzuzufügen:

private void groupBox1_Paint(object sender, PaintEventArgs e) 
{ 
    base.OnPaint(e); 
} 

Jetzt ist meine Formen Malerei sichtbar.

+0

Verwenden Sie stattdessen das Paint-Ereignis der GroupBox. –

+0

Danke. Bitte sehen Sie meine aktualisierte Frage. –

+0

Jedes Steuerelement hat eigene Paint-Ereignisse. Wenn das Formular gezeichnet wird (wenn die Sichtbarkeit geändert wird), wird jede Steuermethode "OnPaint" aufgerufen (die am Ende des Malens das Ereignis "Paint" aufruft). Sie versuchen, ein benutzerdefiniertes Steuerelement zum Zeichnen der Palette zu erstellen. Es muss nicht 'GroupBox' sein, stattdessen können Sie' Control' verwenden. Wenn Sie diesen 'GroupBox'-Rahmen behalten möchten, können Sie die 'Paint'-Methode überschreiben und zuerst' base.OnPaint' aufrufen und dann darüber zeichnen. Nicht sicher, ob dies der Fall ist, aber manchmal lohnt es sich, alles selbst zu zeichnen (Sie können 'ControlPaint.DrawBorder' verwenden, um einen Rahmen zu zeichnen). – Sinatr

Antwort

1

Jedes Fenster (Steuerung, Formular usw.) hat sein eigenes Bild und Kinder werden normalerweise von diesem Bild abgeschnitten (ausgeschlossen).

Wenn Sie innerhalb des GroupBox (oder jede Kontrolle) zeichnen möchten, sollten Sie, dass in der entsprechenden Steuer (GroupBox in Ihrem Fall) Paint Ereignis behandeln, nicht die Form eines.

private void groupBox_Paint(object sender, PaintEventArgs e) 
{ 
    var area = groupBox.DisplayRectangle; 
    // Draw inside the area 
    e.Graphics.FillRectangle(Brushes.Green, area); 
} 
+0

Ich landete eine 'PictureBox'-Box und benutzte das 'Paint'-Ereignis, weil es' DoubleBuffering' nativ unterstützt. –