이 문제를 해결하기 위해서는 그리기 할 대상을 double buffering 처리를 해 주면 깔끔하게 해결이 된다.
보통은 System.Windows.Forms::Panel위에 그리기 작업을 하게 될텐데, 혹은 Bitmap에 먼저 그린 후 그 Bitmap을 Panle에 그리는 방식이거나...
아무튼 이 경우 Panel을 double buffering 처리를 해 주면 된다.
문제는 Form은 화면 디자인 시점에 DoubleBuffered라는 속성 값을 true로 해 주면 되지만 Panel의 경우는 double buffering을 설정하는 메소드나 속성(property)이 막바로 접근이 안된다.
즉 protected 메소드이고 protected 속성이다.
MSDN을 보면 속성의 정의가 아래와 같이 protected이고
protected virtual bool DoubleBuffered { get; set; }
메소드도 아래와 같이 protected이다.
protected virtual bool DoubleBuffered { get; set; }
따라서 Panel에 double buffering을 설정할려면 Panel을 상속받은 사용자 정의 클래스를 만들어서 이 사용자 정의 Panel을 사용해야 가능하다.
(1) Visual Studio의 해당 프로젝트명에서 마우스 우측 클릭 ⇒ 추가(Add) ⇒ New Item(새 항목) ⇒ Class를 선택 후 Class 이름 지정
(2) 아래의 내용을 추가한다.
class DoubleBufferPanel : Panel
{
public DoubleBufferPanel()
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true
);
this.UpdateStyles();
}
}
(3) Form1.Designer.cs에서 기존의 Panel을 사용자가 정의한 Panel로 변경한다.
위의 적색 사각형 영역 (Windows Form Designer generated code 영역)을 더블 클릭하여 InitializeComponent() 안에 있는
this.panel1 = new System.Windows.Forms.Panel();
를
this.panel1 = new Bitmap_Panel.DoubleBufferPanel();
와 같이 사용자 정의 Panel로 변경해 준다.
이후 부터 화면이 깜빡이는 현상 없이 잘 처리 될 것이다.
MSDN이 소개하는 DoubleBuffered에 대한 설명이다.
Gets or sets a value indicating whether this control should redraw its surface using a secondary buffer to reduce or prevent flicker.
댓글 없음:
댓글 쓰기