2009-10-06 4 views
1

저는 GDI 튜토리얼을 찾고 있었지만 지금까지 발견 한 모든 것이 그래픽에 PaintGuuments를 전달하는 OnPaint 메서드와 함께 작동합니다. 처음부터 시작하는 방법을 찾지 못했습니다. Graphics 클래스 자체를 사용하는 방법을 의미합니까?OnPaint 메서드를 사용하지 않고 타원을 그립니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Pen pen= new Pen(Color.Red, 3); 
      Graphics g; 
      g = this.CreateGraphics(); 
    g.DrawEllipse(pen, 150, 150, 100, 100); 
     } 
    } 
} 

그냥 아무것도 할 나던 : 이 내가 나를 위해 단지 나던 일이 TREID이 전체 코드입니다. 나는 그것을 새로운 형태로 시도했다.

미리 감사드립니다.

+0

그리고 무엇이 작동했는지 또는 작동하지 않았습니까? –

+0

CreateGraphics를 호출하면 생성 된 객체를 수동으로 처리해야합니다. 예를 들어, g.Dispose()를 호출하면 완료해야합니다. – Skizz

답변

1

코드는 아마도 괜찮습니다. 원하는대로 타원을 그립니다. 그러나 Load 이벤트 후에 양식이 표시 될 때 PaintBackground 이벤트가 발생하고 PaintEvent이 표시됩니다. PaintBackground은 기본적으로 컨트롤의 내용을 지우고 방금 그린 타원을 효과적으로 제거합니다.

회화는 2 단계 프로세스입니다

for each (region in set of regions that need updating) 
{ 
    PaintBackground (region) 
    Paint (region) 
} 

컨트롤의 내용이 변경되지 않은 경우 윈도우 매니저는, 업데이트를 필요로 컨트롤의 일부를 다시 그립니다 또는 사용자 작업이 변경되지 않은 컨트롤의 시인성이 없으면 그림이 완성되지 않습니다.

그래서 왜 Load 메서드에서 타원을 그리시겠습니까? 일반적으로 무언가를 그릴 필요가있을 때만 무언가를 그려야하며 PaintBackgroundPaint 이벤트에서 그림이 필요할 때 양식이 전달됩니다.

깜박임이 걱정 되니? 아니면 속도 문제입니까? 타원은 빠르게 그려집니다. 그러나 깜박임은 수정하기가 더 어렵습니다. 비트 맵을 만들고 비트 맵에 그리며 Paint 이벤트 동안 비트 맵을 컨트롤에 blit해야합니다. 또한 PaintBackground 이벤트를 아무 작업도 수행하지 마십시오. 컨트롤을 지우지 않아도 깜박임을 제거하는 것은 지우는 것입니다.

EDIT : 예를 들어 여기 DevStudio 2005를 사용하고 있습니다.

  1. 새 C# winform 응용 프로그램을 만듭니다. Form1.cs 파일에서
  2. 는 다음을 추가 :

    protected override void OnPaintBackground (PaintEventArgs e) 
    { 
        // do nothing! prevents flicker 
    } 
    
    protected override void OnPaint (PaintEventArgs e) 
    { 
        e.Graphics.FillRectangle (new SolidBrush (BackColor), e.ClipRectangle); 
    
        Point 
        mouse = PointToClient (MousePosition); 
    
        e.Graphics.DrawEllipse (new Pen (ForeColor), new Rectangle (mouse.X - 20, mouse.Y - 10, 40, 20)); 
    } 
    
    protected override void OnMouseMove (MouseEventArgs e) 
    { 
        base.OnMouseMove (e); 
        Invalidate(); 
    } 
    
  3. 컴파일 및 실행됩니다.

+0

그리고 입력 매개 변수를 사용하여 항상 일부 특수 객체를 다시 그려야하는 경우 어떻게해야합니까? 내 양식은 마우스를 따르고 있습니다. – Petr

+0

마우스를 따라 이동하고 마우스 이동 이벤트를 처리하고 양식을 무효화하려면 마우스 이동 이벤트에서 컨트롤을 다시 그릴 수 있습니다. – Skizz

관련 문제