C#開発例 - カスタマイズスクリーンショットツール (5) ドラッグ時のちらつきやフリーズを最適化

黄舟
リリース: 2017-03-14 13:27:42
オリジナル
2247 人が閲覧しました

実装時のミスにより、メインフォームの領域再描画技術を使用せず、Labelコンポーネントを使用して、インターセプトされた写真エリアを表示したため、スクリーンショットを撮るときに、インターセプトされた領域が小さくなるか、反転してしまいます。ちらつきとフリーズはより深刻になります。これら 2 つの問題に対処するための、対象を絞った最適化をいくつか紹介します。

C#ダブルバッファリングの説明:

簡単に言うと、描画操作を実行するとき、システムはコンテンツを画面に直接表示せず、まずそれをメモリに保存してから、結果を一度に出力します。ダブルバッファリングを使用しない場合、背景が常に更新されるため、描画プロセス中に画面が激しくちらつくことがわかりますが、ユーザーが描画を終了するのを待っていれば、これは起こりません。出力する前の具体的な方法は、実際には、最初にビットマップ オブジェクト を作成し、次にその中にコンテンツを保存し、最後に画像を表示することを意味します。

ダブルバッファリングを有効にする

        public Form1()
        {
            InitializeComponent();
            // 解决窗口闪烁的问题
            SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
        }
ログイン後にコピー

遅延再描画

マウスをドラッグすると再描画が頻繁に行われます。ここでは、時間を判断して再描画の回数を減らします。

変数を追加:

        /// <summary>
        /// 记录鼠标上一次移动的时间
        /// </summary>
        private long lastMouseMoveTime = System.DateTime.Now.Ticks;
ログイン後にコピー

「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();
                }
            }
        }
ログイン後にコピー
テストの結果、ドラッグ中にちらつきやフリーズが発生する現象が大幅に改善されることがわかりました。





以上がC#開発例 - カスタマイズスクリーンショットツール (5) ドラッグ時のちらつきやフリーズを最適化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート