2016년 9월 5일 월요일

C# 그래픽 작업시 화면 깜빡임을 없애주는 double buffering에 대해





C#에서 실시간 그래프를 그리다 보면 그리기 화면이 깜빡이는 현상을 볼수 있다.
이 문제를 해결하기 위해서는 그리기 할 대상을 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.

댓글 없음:

댓글 쓰기