2009-08-19 3 views
1

Ich habe ein seltsames Verhalten, wenn ich eine nicht rechteckige Region auf ein Windows-Formular anwende (sagen wir mal eine Ellipse). Das Problem ist, dass das Formular für einen Moment verschwindet (als wäre die Region leer), wenn die Größe anfänglich geändert wird. Es sieht aus wie ein leichtes Flackern, während der Inhalt des Desktops hinter dem Formular für einen Bruchteil der Sekunde sichtbar wird. Nach der ersten Größenänderung ist dieses Flackern nicht mehr zu beobachten.Problem beim Anwenden der Region auf ein Formular

Dies kann reproduziert werden, indem Sie einfach ein Windows Forms-Projekt erstellen und eine Ellipsenregion auf das Formular anwenden, indem Sie die Größe des Formulars als Begrenzungsrechteck für die Ellipse verwenden (auf diese Weise können Sie das Formular skalieren) seine Grenzen werden von der Region nicht vollständig "gefressen" werden.

Hinweis: Ich aktualisiere den Bereich des Formulars im OnResize-Ereignis.

Der Code, den ich verwende sieht die folgende Art und Weise:

protected override void OnResize(EventArgs e) 
{ 
    base.OnResize(e); 
    GraphicsPath path = new GraphicsPath(); 
    path.AddEllipse(new Rectangle(Point.Empty, this.Size)); 

    this.Region = new Region(path); 
} 

Irgendwelche Ideen, was dieses verursachen könnte?

Schnell Follow-up:

Ich bemerkte, dass, wenn ich den gleichen Code-Schnipsel in dem OnSizeChanged Ereignisse setzte das Flimmern verschwindet oder nur selten zu geschehen scheint.

Danke!

Antwort

1

Griffe Paint-Ereignis

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
GraphicsPath path = new GraphicsPath(); 
path.AddEllipse(new Rectangle(Point.Empty, this.Size)); 
this.Region = new Region(path); 
} 
+0

Wäre das nicht ein enormer Aufwand, da das Paint-Ereignis mehrmals ausgelöst wird, selbst wenn das Formular nicht in der Größe geändert wird? Ich denke, Region muss nur aktualisiert werden, wenn sich die Größe des Formulars ändert, nicht bei jeder WM_PAINT-Nachricht? – WorldIntruder

0

Sie ein massives Problem für mich in der gleichen Gegend behoben haben.

Ich verwende diese:

private void BorderedPanel_SizeChanged(object sender, EventArgs e) 
    { 
     this.Region = new Region(RoundedRectangle.CreatePlusOne(this.ClientRectangle, this.cornerRadius, this.RectangleCorners)); 
     Refresh(); 
    } 

und es funktioniert ohne Flackern. Es lohnt sich also einen Schuss abzugeben!