Flickering dans une application Windows Forms
j'ai une application qui a une tonne de contrôles. Et il a une énorme quantité de scintillement, en particulier au démarrage.
j'ai appliqué ce fix à elle.
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
return cp;
}
}
cela a bien fonctionné - le scintillement a été réduit d'une quantité assez incroyable. Cependant, l'effet secondaire est que les boutons Minimize, Maximize et Close en haut à droite de la fenêtre ne s'animent pas lorsque je déplace la souris ou clique dessus. (ils fonctionnent cependant toujours). Cela donne à l'application d'un pendu sentir.
comment conserver le WS_EX_COMPOSITED tout en conservant la possibilité d'utiliser les boutons Maximize, Minimize et Close?
cela se produit sur Windows XP. @Fallenidol l'a souligné, ce n'est pas un problème sur Windows 7.
5 réponses
j'ai compris. Le truc est de supprimer le drapeau WS_EX_COMPOSITED après l'affichage du formulaire. L'explication complète et le code sur mon blog:
Comment se débarrasser de scintillement sur les applications Windows Forms
je sais que cette question est un peu vieille, mais mieux vaut tard que jamais. J'ai utilisé votre exemple original que vous avez lié pour en trouver un qui le bascule lors du redimensionnement, puis le bascule en arrière pour dessiner tout le reste parfaitement. Espérons qu'il aide d'autres à la recherche d'une solution à ce problème. Comme le sait L'OP, les propriétés DoubleBuffering ne résolvent pas les problèmes de scintillement.
Voici une solution pour arrêter de clignoter quand un utilisateur redimensionne un formulaire, mais sans toucher up le dessin des commandes telles que DataGridView, NumericUpDown, etc. À condition que le nom de votre formulaire soit "Form1":
int intOriginalExStyle = -1;
bool bEnableAntiFlicker = true;
public Form1()
{
ToggleAntiFlicker(false);
InitializeComponent();
this.ResizeBegin += new EventHandler(Form1_ResizeBegin);
this.ResizeEnd += new EventHandler(Form1_ResizeEnd);
}
protected override CreateParams CreateParams
{
get
{
if (intOriginalExStyle == -1)
{
intOriginalExStyle = base.CreateParams.ExStyle;
}
CreateParams cp = base.CreateParams;
if (bEnableAntiFlicker)
{
cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED
}
else
{
cp.ExStyle = intOriginalExStyle;
}
return cp;
}
}
private void Form1_ResizeBegin(object sender, EventArgs e)
{
ToggleAntiFlicker(true);
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
ToggleAntiFlicker(false);
}
private void ToggleAntiFlicker(bool Enable)
{
bEnableAntiFlicker = Enable;
//hacky, but works
this.MaximizeBox = true;
}
essayez le code suivant. Cela devrait aller dans la forme principale et tous les autres contrôles d'utilisateur personnalisés que vous avez.
// Enable double duffering to stop flickering.
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, false);
this.SetStyle(ControlStyles.Opaque, false);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
Votre devrait essayer windows standard forme propriété de contrôle appelé DoubleBuffered. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered.aspx
je suis juste tombé sur ce post et réaliser qu'il est un peu vieux. Cependant, j'ai le même problème avec ma forme et j'ai découvert (pour XP, de toute façon) qu'une solution inélégante ne semble pas permettre les styles visuels.