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.
'Visual C#' 카테고리의 다른 글
C#의 델리게이트(delegate)에 대한 기본적인 개념 및 간단한 예제 (0) | 2017.12.19 |
---|---|
C# 프로그램을 .dll Library로 만들기(C++에서 사용하기 위해) (0) | 2017.12.07 |
Visual Studio 2017에서 작업을 완료할수 없습니다. 해당 인터페이스를 지원하지 않습니다 (0) | 2017.12.06 |
C# 초 간단 쓰레드(Thread) 예제 (0) | 2017.11.23 |
C# 새로운 Project 열때 template이 다 나타나지 않는 문제 (0) | 2016.09.05 |