Exemple de développement C# - Outil de capture d'écran personnalisé (5) Optimisation du scintillement et du gel lors du glissement

黄舟
Libérer: 2017-03-14 13:27:42
original
2247 Les gens l'ont consulté

En raison d'une erreur lors de l'implémentation, la technologie de redessinage de zone du formulaire principal n'a pas été utilisée. Au lieu de cela, un composant Label a été utilisé pour afficher la zone image interceptée, de sorte que la zone sera interceptée lors du glissement. Lorsque vous réduisez la taille de la capture d'écran ou effectuez une capture d'écran inversée, le scintillement et le gel deviendront plus graves. Nous allons ici procéder à quelques optimisations ciblées pour résoudre ces deux problèmes.

C#Explication du double buffering :

Pour faire simple, lorsque nous effectuons des opérations de dessin, le système est pas directement Au lieu de présenter le contenu à l'écran, enregistrez-le d'abord en mémoire, puis affichez le résultat en une seule fois. Si vous n'utilisez pas la double mise en mémoire tampon, vous constaterez que l'écran clignotera violemment pendant le processus de dessin, car. l'arrière-plan est constamment actualisé. Cette situation ne se produira pas si vous attendez que l'utilisateur ait fini de dessiner avant de sortir. La méthode spécifique consiste à créer d'abord un objet bitmap , puis à y enregistrer le contenu et enfin à le présenter. l'image.

Activer le double tampon

        public Form1()
        {
            InitializeComponent();
            // 解决窗口闪烁的问题
            SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
        }
Copier après la connexion

Redessin différé

Lorsque la souris est déplacée, le redessin sera très fréquent. Le temps est utilisé ici pour juger afin de réduire le nombre de redessins. de tirages.

Ajouter une variable :

        /// <summary>
        /// 记录鼠标上一次移动的时间
        /// </summary>
        private long lastMouseMoveTime = System.DateTime.Now.Ticks;
Copier après la connexion

Ajouter un contrôle de redessinage dans la méthode "UpdateCutInfoLabel" :

        /// <summary>
        /// 更新截图信息显示框,截图编辑工具框
        /// </summary>
        private void UpdateCutInfoLabel(UpdateUIMode updateUIMode) // UpdateUIMode updateUIMode = UpdateUIMode.None
        {
            //大于300毫秒或有组件显示或隐藏才进行重绘
            long mouseMoveTimeStep = System.DateTime.Now.Ticks - lastMouseMoveTime;
            if (mouseMoveTimeStep < 300 && updateUIMode == UpdateUIMode.None) { return; }
            lastMouseMoveTime = System.DateTime.Now.Ticks;

            if (this.lbl_CutImage.Visible || (updateUIMode & UpdateUIMode.ShowCutImage) != UpdateUIMode.None)
            {
                this.lbl_CutImage.SetBounds(this.cutImageRect.Left, this.cutImageRect.Top, this.cutImageRect.Width, this.cutImageRect.Height, BoundsSpecified.All);
                if (!this.lbl_CutImage.Visible)
                {
                    this.lbl_CutImage.Show();
                }
            }
        }
Copier après la connexion

Après les tests, il a été constaté que traînage Le phénomène de scintillement et de décalage a été considérablement amélioré.



Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal