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.
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.
public Form1() { InitializeComponent(); // 解决窗口闪烁的问题 SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); }
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;
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(); } } }
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!