2011-10-18 4 views
1

양식 내 프로그램에서 지금까지 수행 한 작업은 winform에 무엇이든 그릴 수있는 유일한 방법은 System.Windows.Forms.PaintEventArgs를 사용하는 것입니다. 이러한 인수 또는이 네임 스페이스에 액세스 할 수없고 winform에 대한 액세스 권한 만있는 경우 winform에 어떻게 그립니다 (직사각형과 같은 모양)?System.Windows.Forms.PaintEventArgs 네임 스페이스에 액세스하지 않고 Winform에서 그리는 방법?

미리 감사드립니다.

답변

1

Paint 이벤트 외부의 양식 (또는 다른 컨트롤)에 그리려면 해당 컨트롤에 Graphics 개체를 얻어야합니다. 그럼 당신은 당신의 마음의 내용을 칠할 수 있습니다. 그러나 다음에 페인트 메시지가 나오면 그려진 그림이 지워질 수 있습니다.

using (Graphics g = this.CreateGraphics()) 
{ 
    // do all your drawing here 
} 
:

양식에 그리려면
1

이벤트를 구독하여에 액세스하면 구독 한 이벤트 처리기에서 모든 그림을 수행 할 수 있습니다. 해당 PaintEventArgs과 함께 제공됩니다.

2

PaintEventArgs is a classSystem.Windows.Forms namespace. 양식 작업을하는 경우 네임 스페이스 및 클래스에 액세스 할 수 있음을 의미하지만 그리려는 코드의 코드에 액세스 할 수는 없습니다.

양식의 소스 코드에 액세스 할 수있는 경우 Paint 이벤트는 공개되어 있으므로 Form 외부의 코드에서 해당 이벤트 핸들러를 등록 할 수 있습니다. (이 문제는 귀하의 문제라고 생각합니다.)

Form에 대한 참조가 있고 페인트 핸들러에 등록한 다음 임의의 그림을 그리는 간단한 예제 클래스를 참조하십시오.

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 { 
    class Painter { 
     public Painter(Form form) { 
      form.Paint += new PaintEventHandler(form_Paint); 
     } 

     void form_Paint(object sender, PaintEventArgs e) { 
      e.Graphics.DrawLine(Pens.Black, 0, 0, 20, 20); 
     } 
    } 
} 

이 조각에서 중요한 개념은 폼에 대한 참조를 가지고 (또는 제어 파생 개체) 경우 (컨트롤 다시 그리기를해야 할 때마다 자동으로 호출되는 페인트 이벤트에 등록 할 수 있다는 것입니다 그 컨트롤에 원하는 것을 모두 그릴 수 있습니다.)

스 니펫에서 저는 생성자의 Form을 전달하고 거기에 페인트 이벤트로 등록했습니다. 그러나 이것은 간단한 예제를위한 것입니다. 코드의 구조는 다르지만 ... 폼을 가질 것이며 이벤트에 등록한 다음 초기화 단계가있을 것이고 페인팅을 수행하는 메서드를 만들 것입니다.

자신 만의 그래픽 객체를 만들고 처리하여 다른 방법을 그릴 수는 있지만 이는 바람직한 방법은 아닙니다. 하나는 창을 다시 그릴 필요가있을 때 알림을받지 못하고 타이머와 같은 다시 그리기를위한 다른 메커니즘을 만들어야하며 (매우 간단하고보기 흉한 예제처럼) 사용자가 직접 Graphics 개체를 관리해야합니다.