winform 프로그램 배경 이미지 시작 화면 문제

문제 배경

산업 제어 프로젝트에서는 장비나 도면을 시뮬레이션하기 위해 배경 이미지를 로드해야 하는 경우가 종종 있으며 일부 레이블이나 버튼을 동적으로 배치해야 합니다.일반적인 방법은 패널 구성 요소를 사용하여 배경 이미지를 로드하는 것입니다
. 일반적인 문제인 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

추천

출처blog.csdn.net/csdnharrychinese/article/details/131040494