Question

J'essaie de créer des formes personnalisées (uniquement la bordure et la légende) avec une approche différente de celle que vous voyez habituellement, mais je rencontre des problèmes de scintillement lorsque je redimensionne le formulaire.

Je ne sais pas comment expliquer le problème, alors voici une vidéo que j'ai créée pour illustrer le problème: http://www.screencast.com/t/AIqK9Szmz

En outre, voici une solution de test VS2008 avec tout le code repeignant les bordures du formulaire: http: //stuff.nazgulled.net/misc/TestForm.zip

J'espère que quelqu'un pourra m'aider à me débarrasser de ce scintillement ...

Était-ce utile?

La solution

(Ceci est une solution spécifique à Vista; elle ne fonctionne que lorsque la composition de bureau est activée.)

Il semble que Windows initialise le contenu des formulaires redimensionnés en copiant les pixels de la bordure d'origine du formulaire dans les nouvelles zones. Dans votre cas, les nouvelles zones sont initialisées en noir, probablement parce que le formulaire comportait à l'origine des pixels noirs à sa frontière.

Pour supprimer le scintillement, conservez la ligne de pixels la plus à droite du formulaire toujours définie sur TransparencyKey. Les nouvelles zones resteront transparentes jusqu'à ce que vous puissiez les repeindre. C'est-à-dire, élargissez la forme d'un pixel & amp; plus haut que nécessaire et peignez les pixels supplémentaires en transparence.

Exemple: TransparentForm.zip

Autres conseils

C'est ce que j'utilise dans le constructeur de mon formulaire de base:

this.SetStyle( ControlStyles.AllPaintingInWmPaint, true );
this.SetStyle( ControlStyles.UserPaint, true );
this.SetStyle( ControlStyles.OptimizedDoubleBuffer, true );
this.SetStyle( ControlStyles.ResizeRedraw, true );

Je pense que la clé est l'utilisation de "AllPaintingInWmPaint".

Si vous souhaitez que votre formulaire ait une forme irrégulière, vous devrez vous tourner vers des régions (si vous pouvez facilement définir la région de votre formulaire à l'aide de formes géométriques telles que Cercle et Rectangle). Créez un objet System.Drawing.Graphics.Region et ajoutez-lui des formes. Je pense que la propriété du formulaire s’appelle Région - attribuez-lui la région que vous avez créée.

Votre autre option consiste à utiliser des fenêtres en couches. Une personne a effectué tout le travail à votre place . Les fenêtres en couches ne fonctionnent pas sur les versions de Windows antérieures à 2000, mais elles présentent l’avantage supplémentaire d’être semi-transparentes.

Votre dernière option consiste à utiliser WPF et à définir AllowsTransparency = " True " WindowStyle = " None " ;. Cela supprimera le chrome (Google "fenêtre sans chrome WPF" pour un million d'exemples).

Enfin, si vous êtes courageux et patient, vous pouvez toujours capturer le bureau derrière votre fenêtre et le peindre avant toute autre chose. Vous aurez besoin de recourir à un hackery sophistiqué si votre fenêtre se déplace: je ne recommande pas vraiment cette approche, mais vous devez connaître toutes vos options.

Vous devrez abandonner l'utilisation de la propriété Form.TransparencyKey si vous souhaitez éviter le scintillement de superposition de la vidéo noire laide et non initialisée. Cela ne sert à rien dans votre exemple de programme.

Vous avez essayé d’activer DoubleBuffering?

Oh, et d'ailleurs, utiliser le code SLIMcode ne fonctionnera que si vous mettez toute votre logique de dessin dans le remplacement de OnPaint (). Si cela ne vous semble pas familier, vous ne savez probablement pas que vous pouvez demander avec force un repeindre en appelant Invalidate () sur votre formulaire. C’est une mission de refactoriser votre code en une seule méthode Paint - mais à la fin, le code est plus propre.

Pour supprimer le scintillement lors du redimensionnement du formulaire de gains, suspendez la présentation lors du redimensionnement. Remplacez les formes resizebegin / resizeend comme indiqué ci-dessous.

protected override void OnResizeBegin(EventArgs e) {
    SuspendLayout();
    base.OnResizeBegin(e);
}
protected override void OnResizeEnd(EventArgs e) {
    ResumeLayout();
    base.OnResizeEnd(e);
}

Cela laissera les contrôles intacts (comme ceux où ils se trouvaient avant le redimensionnement) et forcera une mise à jour une fois l'opération de redimensionnement terminée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top