블로그 이미지
likeban

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Notice

2011.10.25 13:38 IT


안녕하세요?

 

Control  클래스에 보면, 다음과 같은 메소드가 있습니다.

protected void SetStyle(
        ControlStyles flag,
        bool value
)
이 메소드를 다음과 사용한다면
this.SetStyle(ControlStyles.DoubleBuffer | 
      ControlStyles.UserPaint | 
      ControlStyles.AllPaintingInWmPaint,
      true);
   this.UpdateStyles();
더블 버퍼링이 되는, 컨테이너 (폼 또는 패널) 가 됩니다.
여기까지는 잘 알고 계실겁니다.

문제는 패널에 있습니다.
폼 디자이너를 통해서 생성했다던지, 아니면 직접 코딩해서 집어 넣었든 간에,
다음과 같은 패널을 가정해 보겠습니다.
public class FormXXX : Form
{

     private System.Windows.Forms.Panel panel_Original;

     .....

     .....

    

     public FormXXX()

     {

         ....

         this.panel_Original = new System.Windows.Forms.Panel();
         ....

         ....

         ....

         panel_Original.SetStyle(~~~~~~~);   //SetStyle 메소드 호출 불가. 인텔리센스에도

                                                                //안나옴

         ....

         ....

     }

 

}

 

이렇게 되면, 패널에는 더블 버퍼링을 적용할 수 없게 되죠....

 

아! 그러면, 패널에는 윈폼 자체에서 제공하는 더블 버퍼링을 쓸 수 없다는 건가요?

 

아닙니다!

 

다시 한 번 , SetStyle 메소드를  살펴 보겠습니다.

protected void SetStyle(
        ControlStyles flag,
        bool value
)
여기서, 주목해야 할 점이 있는데, 바로 protected 라는 접근 변경자를 봐야 합니다.
멤버가 protected 접근 변경자로 지정되면,
외부 클래스에는 접근할 수 없으나, 파생된 클래스에서는 접근가능합니다.
자! 그러면
이렇게 해보시면 어떨까요?
public class DoubleBufferedPanel : Panel
{
   public DoubleBufferedPanel()
   {
     this.SetStyle(ControlStyles.AllPaintingInWmPaint
                   | ControlStyles.OptimizedDoubleBuffer, true);
   }
}
폼처럼, Panel 클래스를 상속하여, 그 안의 생성자에서 더블 버퍼링 관련 코드를 적는 것입니다.
이제는 Panel 클래스가 아닌 DoubleBufferedPanel 클래스를 사용하면 됩니다.
차이는, 하나는 더블 버퍼링이 안되고, 다른 하나는 더블 버퍼링이 된다는 겁니다.

public class FormXXX : Form
{
     private DoubleBufferedPanel panel_Original;
     .....
     .....
    
     public FormXXX()
     {
         ....
         this.panel_Original = new DoubleBufferedPanel ();
         ....
         ....
         ....


// 이제 아래와 같은 코드는 필요없음. 어차피 호출도 않되는 거지만..



         //panel_Original.SetStyle(~~~~~~~);  

         ....
         ....

     }
 
}
다 됐습니다.
패널에 더블 버퍼링이 적용되었습니다.
소스 코드를 이와 유사하게 고쳐서
테스트 해보세요.
번쩍거리는 현상이 없어질 겁니다.


출처 : http://blog.naver.com/wavelee?Redirect=Log&logNo=100059298319

panel을 동적으로 만드신 것이 아니라면
.Designer.cs라는 확장자를 가진 파일에서 this.panel = new System.Windows.Forms.Panel();  의 형식으로 panel 객체를 선언한 부분이 있습니다.
이 부분을  this.panel = new DoubleBufferedPanel(); 로 수정하시면됩니다.
저작자 표시 비영리 변경 금지
신고
posted by likeban

티스토리 툴바