実装時のミスにより、メインフォームの領域再描画技術を使用せず、Labelコンポーネントを使用して、インターセプトされた写真エリアを表示したため、スクリーンショットを撮るときに、インターセプトされた領域が小さくなるか、反転してしまいます。ちらつきとフリーズはより深刻になります。これら 2 つの問題に対処するための、対象を絞った最適化をいくつか紹介します。
簡単に言うと、描画操作を実行するとき、システムはコンテンツを画面に直接表示せず、まずそれをメモリに保存してから、結果を一度に出力します。ダブルバッファリングを使用しない場合、背景が常に更新されるため、描画プロセス中に画面が激しくちらつくことがわかりますが、ユーザーが描画を終了するのを待っていれば、これは起こりません。出力する前の具体的な方法は、実際には、最初にビットマップ オブジェクト を作成し、次にその中にコンテンツを保存し、最後に画像を表示することを意味します。
public Form1() { InitializeComponent(); // 解决窗口闪烁的问题 SetStyle(ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); }
マウスをドラッグすると再描画が頻繁に行われます。ここでは、時間を判断して再描画の回数を減らします。
変数を追加:
/// <summary> /// 记录鼠标上一次移动的时间 /// </summary> private long lastMouseMoveTime = System.DateTime.Now.Ticks;
/// <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 サイトの他の関連記事を参照してください。