Aufgrund eines Fehlers bei der Implementierung wurde nicht die Bereichsneuzeichnungstechnologie des Hauptformulars verwendet. Stattdessen wurde eine Label-Komponente verwendet, um den abgefangenen Bildbereich anzuzeigen, sodass der Bereich beim Ziehen abgefangen wird Wenn Sie den Screenshot verkleinern oder einen umgekehrten Screenshot erstellen, treten Flimmern und Einfrieren stärker auf. Hier sind einige gezielte Optimierungen, um diese beiden Probleme zu beheben.
Um es einfach auszudrücken: Wenn wir Zeichenvorgänge ausführen, ist das System nicht direkt Anstatt den Inhalt auf dem Bildschirm anzuzeigen, speichern Sie ihn zuerst im Speicher und geben Sie dann das Ergebnis auf einmal aus. Wenn Sie keine doppelte Pufferung verwenden, werden Sie feststellen, dass der Bildschirm während des Zeichenvorgangs heftig flackert Der Hintergrund wird ständig aktualisiert. Diese Situation tritt nicht auf, wenn Sie warten, bis der Benutzer mit dem Zeichnen fertig ist. Die spezifische Methode besteht darin, zuerst ein Bitmap--Objekt zu erstellen, dann den Inhalt darin zu speichern und ihn schließlich anzuzeigen das Bild.
public Form1() { InitializeComponent(); // 解决窗口闪烁的问题 SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); }
Wenn die Maus gezogen wird, wird hier sehr häufig neu gezeichnet, um die Anzahl der Neuzeichnungen zu reduzieren von Unentschieden.
/// <summary> /// 记录鼠标上一次移动的时间 /// </summary> private long lastMouseMoveTime = System.DateTime.Now.Ticks;
Neuzeichnungssteuerelement in der Methode „UpdateCutInfoLabel“ hinzufügen:
/// <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(); } } }
Nach dem Testen wurde Folgendes festgestellt Ziehen Das Phänomen des Flackerns und der Verzögerung wurde deutlich verbessert.
Das obige ist der detaillierte Inhalt vonC#-Entwicklungsbeispiel – angepasstes Screenshot-Tool (5) Optimierung für Flackern und Einfrieren beim Ziehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!