문제 배경
산업 제어 프로젝트에서는 장비나 도면을 시뮬레이션하기 위해 배경 이미지를 로드해야 하는 경우가 종종 있으며 일부 레이블이나 버튼을 동적으로 배치해야 합니다.일반적인 방법은 패널 구성 요소를 사용하여 배경 이미지를 로드하는 것입니다
. 일반적인 문제인 BackgroundImage 속성 예, 창 크기가 조정되거나 레이블이 동적으로 추가/삭제되면 인터페이스에 매우 분명한 화면 깜박임 현상이 나타납니다.
public void loadPicture(string fileName)
{
pnlContainer.BackgroundImageLayout = ImageLayout.Stretch;
pnlContainer.BackgroundImage = null;
if (string.IsNullOrWhiteSpace(fileName) == false)
{
pnlContainer.BackgroundImage = Image.FromFile(fileName);
}
}
해결 방법: pictureBox를 사용하여 배경 이미지 로드
컨테이너 패널에 새 pictureBox 구성 요소를 추가하고, pictureBox 구성 요소를 사용하여 배경 이미지를 로드하고, pictureBox 구성 요소 자체가 최적화되어 화면 깜박임 문제를 잘 해결할 수 있습니다. 유일한 문제는 pictureBox 구성 요소를 다음과 같이 사용할 수 없다는 것입니다. 컨테이너 및 동적으로 생성된 레이블 구성 요소의 z -order 방향은 항상 pictureBox에 의해 커버되므로 레이블을 동적으로 생성한 후 pictureBox1.SendToBack()은 pictureBox1이 맨 아래 레이어에 배치되도록 합니다.
public void loadPicture(string fileName)
{
pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
pictureBox1.BackgroundImage = null;
if (string.IsNullOrWhiteSpace(fileName) == false)
{
pictureBox1.BackgroundImage = Image.FromFile(fileName);
}
}
//在调用 newManyLabels() 之后, 再调用 pictureBox1.SendToBack(), 确保 pictureBox1 放置到最下层, 形成背景效果.
해결 방법: 타이머를 사용하여 다시 그리기 빈도 줄이기
창 크기가 변경되면 패널이 즉시 새로 고쳐지지 않습니다. 타이머를 사용하여 새로 고침을 지연(예: 50밀리초)할 수 있습니다. 이는 여러 크기 조정으로 인해 발생하는 새로 고침 요청을 통합하여 오버드로 및 깜박임을 방지합니다.
Timer timer = new Timer();
timer.Interval = 50;
timer.Tick += (s, e) => panel.Invalidate();
솔루션: 이중 버퍼링 기술 사용
내 시나리오에서는 작동하지 않습니다. http://csharp.tips/tip/article/852-how-to-prevent-flicker-in-winforms-control https://chuxing.blog.csdn.net/article/ 상세/38313575