2010-10-15 6 views
0

Créer une .net 2.0 application de formulaire Windows, ajoutez un remplissage à quai SplitContainer, avec ceci dans son constructeur de forme:Les marges noires apparaissent lors de l'expansion du formulaire?

public Form1() 
{ 
    InitializeComponent(); 

    for (int i = 1; i <= 300; i++) 
    { 
     FlowLayoutPanel f = new FlowLayoutPanel(); 
     f.Dock = DockStyle.Fill; 
     Button b = new Button(); 
     f.Controls.Add(b); 
     splitContainer1.Panel2.Controls.Add(f); 
    } 
} 

Appuyez sur F5. Saisissez le formulaire par le bord inférieur droit et faites glisser rapidement pour agrandir le formulaire. Le formulaire se développe plutôt par saccades en raison du travail effectué dans tous les contrôles.

J'ai une application avec un formulaire avec quelques contrôles lents qui est également devenu lent. La différence est que dans mon application, je reçois un espace noir laid apparaître pendant une fraction de seconde dans les lacunes que je fais glisser le formulaire avec ma souris. La fenêtre ne se dessine pas correctement. Cet espace noir laid n'apparaît pas dans l'exemple de code ci-dessus.

Des idées qui pourraient provoquer l'apparition d'un espace noir lors de l'expansion d'une forme lente?

J'ai essayé le double-tampon mais cela ne fait aucune différence.

EDIT: J'ai démonté la forme jusqu'à ses bases afin que cela puisse être reproduit. Démarrez une nouvelle application Windows Form C# appelée WindowsFormsApplication_SampleFault. Collez le code ci-dessous dans le Form1.cs

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Reflection; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.Security.Principal; 
using System.Runtime.InteropServices; 


namespace WindowsFormsApplication_SampleFault 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      for (int i = 1; i <= 200; i++) 
      { 
       Button b = new Button(); 
       b.Dock = DockStyle.Fill; 
       this.Controls.Add(b); 
      } 
     } 
     } 
} 

puis coller dans Form1.Designer.cs

namespace WindowsFormsApplication_SampleFault 
{ 
    partial class Form1 
    { 
      /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     private System.ComponentModel.IContainer components = null; 

     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
     /// 

     protected override void Dispose(bool disposing) 
     { 
      if (disposing && (components != null)) 
      { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #region Windows Form Designer generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() 
     { 
      this.statusStrip1 = new System.Windows.Forms.StatusStrip(); 
      this.SuspendLayout(); 
      // 
      // statusStrip1 
      // 
      this.statusStrip1.Location = new System.Drawing.Point(0, 472); 
      this.statusStrip1.Name = "statusStrip1"; 
      this.statusStrip1.Size = new System.Drawing.Size(756, 22); 
      this.statusStrip1.TabIndex = 6; 
      this.statusStrip1.Text = "statusStrip1"; 
      // 
      // frmOptions 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
      this.ClientSize = new System.Drawing.Size(756, 494); 
      this.Controls.Add(this.statusStrip1); 
      this.DoubleBuffered = true; 
      this.ImeMode = System.Windows.Forms.ImeMode.Off; 
      this.MinimizeBox = false; 
      this.MinimumSize = new System.Drawing.Size(750, 500); 
      this.Name = "frmOptions"; 
      this.ShowIcon = false; 
      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 
      this.ResumeLayout(false); 
      this.PerformLayout(); 

     } 

     #endregion 

     private System.Windows.Forms.StatusStrip statusStrip1; 

    } 
} 

Appuyez sur F5 et tenter de glisser le formulaire. Remarque Je surcharge délibérément le mécanisme de redessiner pour produire les zones noires.

Je crois que quelque chose ne va pas avec le code du concepteur de formulaire, mais je ne sais pas quoi.

+0

Je suis sur une machine rapide, un i7. Peut-être essayer avec 50 boutons? Juste assez pour rendre l'interface utilisateur léthargique lorsque vous faites glisser le formulaire. Puis les zones noires apparaissent en arrière-plan pendant que je le fais glisser – BillyG

Répondre

0

Ce cas particulier peut être facilement résolu par WS_EX_COMPOSITED.

const int WS_EX_COMPOSITED = 0x02000000; 
protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle |= WS_EX_COMPOSITED; 
     return cp; 
    } 
} 

P.S. 200 boutons est trop pour une interface graphique :)

à mon humble avis

ÉDITÉ: ici je poste ce que je réussi à faire pour corriger les boîtes noires sur Win7. Le code est un peu moche mais l'idée est claire j'espère.

public Form1() 
{ 
    InitializeComponent(); 

    for (int i = 1; i <= 200; i++) 
    { 
     Button b = new Button(); 
     b.Dock = DockStyle.Fill; 
     this.Controls.Add(b); 
    } 
    _layoutWorker.Tick += new EventHandler(LayoutWorker_Tick); 

} 

private void LayoutWorker_Tick(object sender, EventArgs e) 
{ 
    _layoutWorker.Stop(); 
    this.PerformLayout(); 
} 

protected override void OnResize(EventArgs e) 
{ 
    this.SuspendLayout(); 
    base.OnResize(e); 
    this.ResumeLayout(false); 
    _layoutWorker.Start(); 
} 

private Timer _layoutWorker = new Timer { Enabled = false, Interval = 1 }; 
+0

Salut j'ai essayé ça mais ça ne résout pas le problème. Je suis sur Win7 Ultimate avec les paramètres d'interface utilisateur par défaut que je crois est l'aero – BillyG

+0

J'ai remplacé CreateParams et les boîtes noires ont disparu (Vista Home). Il ya des boîtes blanches au lieu de boîtes noires, ce qui est beaucoup mieux :) Je n'ai pas d'ordinateur Win7 maintenant, laissez-moi essayer plus tard ... –

+0

Je suppose que vous avez réussi à reproduire en utilisant le code ci-dessus? Je l'ai corrigé dans l'exemple ci-dessus en supprimant DoubleBuffered. Cela laisse un espace blanc. Mais dans mon application de production, la suppression de DoubleBuffered ne le résout pas. – BillyG

Questions connexes