구현 중 실수로 인해 기본 폼의 영역 다시 그리기 기술을 사용하지 않고 대신 Label 컴포넌트를 사용하여 가로채는 그림 영역을 표시하므로 드래그 시 해당 영역이 가로채어지게 됩니다. 스크린샷을 더 작게 만들거나 스크린샷을 거꾸로 찍을 때 깜박임과 정지 현상이 더 심각해집니다. 다음은 이 두 가지 문제를 해결하기 위한 몇 가지 대상 최적화입니다.
간단히 말하면 그리기 작업을 수행할 때 시스템은 다음과 같습니다. 직접 화면에 내용을 표시하는 대신, 먼저 메모리에 저장한 후 결과를 한꺼번에 출력하는 방식으로 이중 버퍼링을 사용하지 않으면 그리기 과정에서 화면이 심하게 깜박이는 것을 볼 수 있습니다. 배경이 계속 새로 고쳐집니다. 출력하기 전에 사용자가 그리기를 마칠 때까지 기다리면 이러한 상황이 발생하지 않습니다. 구체적인 방법은 먼저 비트맵 개체 를 만든 다음 그 안에 콘텐츠를 저장하고 마지막으로 표시하는 것입니다. 이미지.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!