Heim  >  Artikel  >  Backend-Entwicklung  >  C#-Entwicklungsbeispiel – angepasstes Screenshot-Tool (5) Optimierung für Flackern und Einfrieren beim Ziehen

C#-Entwicklungsbeispiel – angepasstes Screenshot-Tool (5) Optimierung für Flackern und Einfrieren beim Ziehen

黄舟
黄舟Original
2017-03-14 13:27:422018Durchsuche

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.

C#Erklärung zur doppelten Pufferung:

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.

Doppelte Pufferung aktivieren

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

Verzögertes Neuzeichnen

Wenn die Maus gezogen wird, wird hier sehr häufig neu gezeichnet, um die Anzahl der Neuzeichnungen zu reduzieren von Unentschieden.

Variable hinzufügen:

        /// <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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn