2012-03-28 11 views
2

Ich erstelle eine benutzerdefinierte DataGridView, in der die CheckBox zeigt einen Rahmen, wenn MouseHover ausgelöst wird.Zeichnen in C# winform ist ziemlich langsam

Hier ist was ich bisher gemacht habe.

void checkBox_MouseLeave(object sender, EventArgs e) 
    { 
     //showBorder defines whether the border is drawn. 
     this.showBorder = false; 
     this.DataGridView.InvalidateCell(this); 
    } 

    void CheckBoxMouseHover(object sender, EventArgs e) 
    { 
     this.showBorder = true; 
     this.CheckBox.BringToFront(); 
     this.DataGridView.InvalidateCell(this); 
    } 

    protected override void Paint(...........) 
    { 
     .......... 
     if (showBorder) 
     { 
      GraphicsPath border=new GraphicsPath(); 
      border.AddRectangle(new Rectangle(checkBoxPosition.X-1,checkBoxPosition.Y-1,checkBoxSize.Width+1,checkBoxSize.Height+1)); 
      graphics.DrawPath(new Pen(borderColor,1),border); 
     } 
    } 

Aber es kommt so langsam, dass ich etwa eine halbe Sekunde warten muss, um die Grenze zu sehen. Wie auch immer, MouseLeave funktioniert gut. Also, wie kann ich hier die Leistung verbessern?

Außerdem, wie kann ich das Kontrollkästchen anpassen? B. die Hintergrundfarbe usw.

+1

Sind Sie mit Double Buffering vertraut? http://www.bobpowell.net/doublebuffer.htm –

+0

Ich versuchte automatische Double Buffering, und es machte keinen Unterschied. – user840866

Antwort

4

Sie verwenden das MouseHover-Ereignis für die Maus, die über die Steuerung geht. Versuchen Sie stattdessen MouseEnter. MouseHover wird ausgelöst, wenn die Maus für eine kurze Zeit über dem Steuerelement verbleibt. MouseEnter ist Instant

+0

Danke. Es hat gut funktioniert. – user840866