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.




+ Recent posts