2011-11-29 5 views
0

원을 그리는 데 패널을 사용하고 있지만 탭을 변경하거나 프로그램을 최소화 할 때 문제가 발생합니다. & 다음 프로그램을 최대화 한 다음 제거 된 모든 요소가 제거됩니다. 어느 것이 그 이유가 무엇인지 말해 줄 수 있습니까?창 모양의 패널에 도형을 그리는 방법은 무엇입니까?

+0

어떤 객체의 이벤트를 그리는 중입니까? – Nighil

답변

0

컨트롤이 무효화 된 다음 다시 그려지는 것이 그 이유입니다.
Paint 이벤트를 잡고 패널 내부에서 필요한 모든 것을 다시 그려야합니다.
이 이벤트는 컨트롤을 부분적으로 완전히 그려야 할 때마다 발생합니다.

사용자 주석 후 편집 : 사용자가 뭔가를 그릴 때, 당신이 List의 모양 (형태와 다양한 좌표)를 저장하고, Paint 이벤트, 위에서 아래로 목록에 포함 된 모든 것을 다시 그릴 수
.

+0

예를 들어, 내 프로그램의 사용자는 5 개의 원을 그리고 프로그램을 최소화하고 최대화 한 후에 원을 다시 그려야합니까? – Desire

+0

공용 override OnPaint 사용하기 (... 비트 맵으로 그리기와 같은 그리기와 같은 버퍼를 고려해야합니다 (추가, 제거 또는 변경할 때 모양 만 다시 그리도록). – James

+0

@Aqib : 쉬운 대답은 yes입니다. 컨트롤을 숨기거나 (다른 컨트롤이 넘어서 기 때문에) 컨트롤이 무효화되면 다시 그려야하고 수행 한 모든 작업을 다시 완료해야합니다 !! – Marco

0

그리는 것은 (기본적으로) 지속성이 없으며 임의의 문자를 잃어 버릴 수 있습니다. (덮어서 숨기고 최소화, UAC 프롬프트 등) 이 문제를 해결하려면 무엇을 그려야하고 Paint 이벤트에서 다시 그려야합니까?

5

코드를 게시하지 않았기 때문에 모든 독자는 추측 할 수 있습니다. 내 생각 엔 당신이 실수로 CreateGraphics를 사용하고있을 가능성이 높습니다.

패널의 페인트 이벤트는 다음과 같아야합니다.

private void panel1_Paint(object sender, PaintEventArgs e) { 
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    e.Graphics.FillEllipse(Brushes.Red, new Rectangle(10, 10, 32, 32)); 
} 

페인트 이벤트에서 모든 도면을 수행합니다. 새로 고침을하려면 panel1.Invalidate()으로 전화하십시오.

비트 맵 그리기 경우,이처럼 처리 할 수있는 :

Bitmap bmp = new Bitmap(500, 500); 

private void button1_Click(object sender, EventArgs e) { 
    using (Graphics g = Graphics.FromImage(bmp)) { 
    g.SmoothingMode = SmoothingMode.AntiAlias; 
    g.Clear(Color.White); 
    g.FillEllipse(Brushes.Red, new Rectangle(10, 10, 32, 32)); 
    } 
    panel1.Invalidate(); 
} 

private void panel1_Paint(object sender, PaintEventArgs e) { 
    e.Graphics.DrawImage(bmp, new Point(0, 0)); 
} 
0

버퍼링을 다음과 같이 : 이 (당신은 양식 부하에 더 큰 비트 맵을 강제로 크기를 조정 양식에 다시 그리기 건너 뛸 수 있습니다.)

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 WindowsFormsApplication10 
{ 
    public partial class Form1 : Form 
    { 
     Bitmap bitmap = null; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Redraw(); 
     } 

     protected override void OnPaintBackground(PaintEventArgs e) 
     { 
      OnPaint(e); 
     } 

     protected override void OnPaint(PaintEventArgs e) 
     { 
      if (bitmap == null) 
      { 
       base.OnPaint(e); 
      } 
      else 
      { 
       e.Graphics.DrawImageUnscaled(bitmap, 0, 0); 
      } 
     } 

     private void Form1_Resize(object sender, EventArgs e) 
     { 
      Redraw(); 
     } 

     private void Form1_ResizeEnd(object sender, EventArgs e) 
     { 
      Redraw(); 
      this.Invalidate(); 
     } 

     private void Redraw() 
     { 
      if (bitmap != null) 
      { 
       bitmap.Dispose(); 
       bitmap = null; 
      } 
      bitmap = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
      using (Graphics g = Graphics.FromImage(bitmap)) 
      { 
       g.Clear(Color.White); 
       // This is where you could use a List<Shape> etc... 
       g.DrawEllipse(Pens.Black, new Rectangle(10, 10, 20, 20)); 
       g.DrawEllipse(Pens.Black, new Rectangle(20, 30, 20, 20)); 
       g.DrawEllipse(Pens.Black, new Rectangle(50, 90, 30, 20)); 
      } 

     } 



    } 
} 
관련 문제