윈도우 프로그래밍 시에 invalidate()

invalidate() 호출하면 그래픽 요소들이 사정없이 떨리면서 업데이트 되는 데 이걸 해결할 방법이 있나요?

이 글에 평점 주기:

2005-03-04 오후 4:12:52   /  번호: 47578  / 평점: (9.0)

Re: 더블 버퍼링


자게에 글올리셨던 분이군요.

더블 버퍼링을 하기 위해서는 폼의 Load이벤트에 아래의 코드를 넣습니다.

this.SetStyle(ControlStyles.DoubleBuffer,true);

this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);

this.SetStyle(ControlStyles.UserPaint,true);

이 글에 평점 주기:

2005-03-04 오후 5:27:47   /  번호: 47587  / 평점: (-)

Re: 더블버퍼링의 사용에 대해서


답변 감사합니다. 막상 더블 버퍼링을 적용하려니 용법을 잘 모르겠습니다.

using  System;

using  System.Drawing;

using  System.Drawing.Drawing2D;

using  System.Windows.Forms;

class HowdyWorld:Form

{

    public static void Main()

    {

        Application.Run(new HowdyWorld());

    }

    public HowdyWorld()

    {

        Text="howdy, world";

        MinimumSize=SystemInformation.MinimumWindowSize+new Size(0,1);

    }

    public void EnableDoubleBuffering()

    {

       this.SetStyle(ControlStyles.DoubleBuffer |

          ControlStyles.UserPaint |

          ControlStyles.AllPaintingInWmPaint,

          true);

       this.UpdateStyles();

    }

    protected override void OnResize(EventArgs e)

    {

        Invalidate();

    }

    protected override void OnPaint(PaintEventArgs pea)

    {

        Graphics grfx=CreateGraphics();

        Color clr=ForeColor;

        float cx=ClientSize.Width;

        float cy=ClientSize.Height;

        Font font = new Font("Times New Roman", 10, FontStyle.Italic);

        SizeF sizef=grfx.MeasureString(Text, font);

        float fScale=Math.Min(cx/sizef.Width, cy/sizef.Height);

        Console.WriteLine(font.SizeInPoints);

        font=new Font(font.Name, fScale*font.SizeInPoints, font.Style);

        sizef=grfx.MeasureString(Text, font);

        grfx.DrawString(Text, font, new SolidBrush(clr), (cx-sizef.Width)/2, (cy-sizef.Height)/2);

    }

}

위와 같은 프로그램인데 어디에 더블 버퍼링을 추가해야 하나요?

이 글에 평점 주기:

2005-03-04 오후 6:35:30   /  번호: 47593  / 평점: (9.0)

Re: 그것은...


C#은 내부적으로 더블버퍼링을 해주기때문에

말씀드린대로 폼의 Load이벤트(혹은 생성자)에 코드를 넣어두기만 하면 됩니다.

OnPaint를 오버라이드하셨는데 그러면 더블버퍼링이 안되는걸로 알고있습니다.  <-난 계속이렇게 해서 삽실했따;;;

특별한 경우가 아니라면 Paint이벤트에서 그리는 작업을 하시면 더블버퍼링이 적용됩니다.

이 글에 평점 주기:

2005-03-04 오후 8:55:57   /  번호: 47600  / 평점: (9.0)

Re: 더블 버퍼링은...

Dc 영역을 제어해야합니다.

기본적으로 C#에서는 SetStyle 조건에 의해서 내부적으로 더블버퍼링을 제공하지만,

막상 사용하시다보면, 실제로 적용이 되는 부분은 님이 어떻게 코딩하는냐에 달렸습니다.

기본은 화면에 보여지는 Dc영역을 제어하여 그림을 뿌리거나, 글자를 넣거나, 하지만, 제어가 커지거나, 큰이미지를 넣어서 이동 같은

부분들을 넣다보면, 껌벅이는 부분이 보일겁니다.( 컴퓨터 사용이 좋다면, 작은 이미지는 느끼지 못하죠)

그래서 구현해야하는 것이 내부적으로 제어되는 dc 영역입니다.

화면은 항상 마지막 구현부분을 보여주며, 이 전의 작업은 내부적으로 작업하여 감추어 두는 거죠..

혹은 배경과 아이콘 영역을 따로 사용하는 것도 있으며, 아이콘의 영역의 사이즈를 주어 dc을 작게 제어하는 방법도 있습니다.

강좌는 많지 않은걸로 기억하며, 자료실의 그림판, 또는 이미지 로 검색하여, 소스를 보시는게 가장 쉽게 이해하실겁니다.

보시면 대부분이 dc 영역은 2가지로 표현되어 있지요..

전 C#으로 그림판하나 만들면서 충격을 많이 받았죠.. 아직도 모든 기능은 구현 못 했습니다.

VC++로 예전에 만든 것은 속도가 괜찮았으나, 다른 고수님들의 소스를 보면서 만들었기에..  나도 모르는 사이에 더블 버퍼링이 구현되었는지도

모릅니다.

c#을 하면 조금씩 알게된 Graphics의 Dc 영역은 놀라웠으며, 공부해야하는 범위가 넓었습니다.

C# 소스를 보시면서 주의해야할점은 OOP 개념이 많이 도입되어서 잘 만들어진 소스는 보면 볼 수록 이해가 안될겁니다.

잘 만들었다고 무조건 참고하시면 -_-ㅋ  머리 아포~^^;;

그럼 ㅅㄱ하세요

 

Re: DC가 먼가요?

그렇다면 더블버퍼링의 문제는 아닌 것 같군요.

저는 OnPaint에서 로직을 구현했거든요.

그렇다면 Dc라는 것을 파야  할 텐데.

Dc가 먼지에 대해 간단한 설명이도 부탁드립니다.

아니면 참고자료라도

 

Re: Device Context의 약자

깊이 공부하시려면 WinAPI 에 관련된 책을 하나 사서 보는게 빠를겁니다.

인터넷에서 체계적으로 개념을 정리하기는 쉽지 않죠.

클래스, 메소드 의 용법이나 활용등은 찾기 쉬워도요~

참고로 WinAPI 는 Window UI 를 C 로 짤 수 있도록 만들어진 API 입니다.

쓰기 불편하고 복잡하고 정신없기 때문에 거기에 골격을 붙여서 MFC 란게 나온거고요(이건 기본 문법이 C++ 입니다. C++ 이나 C 나 큰 차이는 없지만요)

꽤 편해지긴 했지만 여전히 새로 배우기에는 골차아프고 복잡하죠

C# 같은 경우는 UI 쪽으로 복잡한것들을 다 생략하고 엄청나게 간결하게 된겁니다. ^^

제가 보고 있는 Professional C# 책의 GDI 부분에 보니까 어느정도 설명이 나와있네요. (아 책 광고 하는건 아닙니다. 저도 학생이니까..)

+ Recent posts