J'ai deux problèmes avec un propre contrôle utilisateur qui utilise des bitmaps:
Le contrôle est composé de trois bitmaps: p>
Tous les bitmaps d'occasion ont une résolution de 500 x 500 pixels. Le contrôle fonctionne comme ceci: https://www.dropbox.com/s/t92guestwdkx8z/stattatandrotor.gif (c'est une animation GIF ) P>
Le contrôle de l'utilisateur doit s'attirer chaque fois qu'il reçoit un nouvel angle de rotor. Par conséquent, il a une propriété publique 'rotorangle' qui ressemble à ceci: p> mais lorsque j'utilise ce code - ce qui fonctionne bien dans d'autres contrôles d'utilisateur - le contrôle de l'utilisateur est Non dessiné du tout si le contrôle est double tampon via dans le constructeur de contrôle I SET: P> rafraîchir code> augmente l'événement code> code>. Le gestionnaire d'événements p> p>
setStyle (contrôlstyles.optimizeddoublebuffer, true) code>. Si je ne configurais pas ce drapeau sur true, le contrôle des flickers lors de la redécoupage. P>
public float RotorAngle
{
get { return mRotorAngle; }
set
{
mRotorAngle = value;
Draw(mRotorAngle);
}
}
5 Réponses :
Dessin à l'écran sur l'événement de peinture est une forte opération. Faire de la peinture sur mémoire tampon est relativement très rapide. p>
double tampon améliorera les performances. Au lieu de dessiner sur des graphiques de peinture, créez un nouveau graphisme et faites-le tout de le dessiner. P>
Une fois le dessin bitmap terminé, copiez l'ensemble du bitmap vers E.Graphics reçu de PAINTEventargs P>
Dessin sans scintillement à l'aide de GDI + et C # < / a> p>
Premièrement, la réponse de Larstech, vous devez utiliser le contexte code> graphiques > fourni dans le second, dans votre bloc SetStyle, ajoutez: p> ... Pour empêcher le contrôle de la classe de base de remplir la couleur d'arrière-plan avant d'appeler votre gestionnaire de peinture. P> J'ai testé cela dans votre exemple projet , il semblait éliminer le scintillement. P> p> PAINTEventARGS code>. En appelant
Creategraphics () Code> à l'intérieur du gestionnaire code> de peinture code>, vous empêchez
optimisédoublebuffer code> de fonctionner correctement.
N'utilisez pas J'ai changé comme et ajouté clairement depuis que le redimensionnement montrerait l'image fantôme: p> appelé à partir de: p> dans le constructeur, activez le double tampon, mais je pense que la transparence n'est pas la transparence T nécessaire: p> Creategraphics CODE>, mais utilisez l'objet graphique qui vous a été transmis à partir de l'événement de peinture:
Pour ma réponse, j'ai pris l'inspiration de https://stackoverflow.com/a/2608945/455904 et j'ai nabbé des trucs de Leststechs répondorms ci-dessus.
Pour éviter de régénérer l'image complète sur toutes les ondulations, vous pouvez utiliser une variable pour maintenez l'image générée. p>
public float RotorAngle { get { return mRotorAngle; } set { mRotorAngle = value; Invalidate(); } }
Merci beaucoup pour votre aide.
scintillement est résolu. :) p>
maintenant, je suis Suggestion de Larstech's et utilisez le Merci lnmx pour l'indice que merci SALLALE pour vos efforts. Je vais tester votre code aujourd'hui et je vais donner des commentaires. J'espère que cela améliorera les performances car il ya toujours un problème de performance - malgré un double tampon correct. P> Il y avait encore un autre problème de performance dans mon code d'origine. P> modifié P> < Pré> xxx pré> à p> Graphiques CODE> Objet à partir de
PAINTEventARGS CODE>. P>
créationgraphics () code> intérieur
peinture code> Le gestionnaire empêche la fonction correcte de
optimisédoublebuffer code>. Ceci explique le problème scintillant même si
optimisédoublebuffer code> a été activé. Je ne savais pas que et je n'ai pas non plus trouvé cela à
painteventargs code>. P>
Je ne peux pas entrer dans tous les détails maintenant, mais vous devez regarder la double tampon. Heureusement, il est très simple en 2008+ la façon dont vous faites l'actualisation dans la propriété est également mauvaise.
Veuillez ne pas double tampon si votre application peut être utilisée sur desktop à distance - voir Ce lien . Vous pouvez vérifier si la session en cours est à Remote Desktop avec:
si (Systeminformation.terminalserverSession) ... code>