2013-07-27 5 views
4

VB.NET을 사용하여 간단한 선을 그리려합니다.VB.NET에서 선을 그리는 방법

내 코드는 다음과 같습니다. 그러나 코드를 실행하면 양식 만 표시됩니다. 줄이 없습니다.

여기서 내가 뭘 잘못 했니?

Public Class Form1 
    Dim pen As System.Drawing.Graphics 
    Private Sub Form1_Load(ByVal sender As System.Object, 
         ByVal e As System.EventArgs) Handles MyBase.Load 
    pen = Me.CreateGraphics() 
    pen.DrawLine(Pens.Azure, 10, 10, 20, 20) 
    End Sub  
End Class 

답변

9

기본적으로 잘못된 것은 CreateGraphics 방법을 사용하는 것입니다.

이것은 언젠가는해야 할 일입니다. 물론 방법이 깨진 것처럼 아닙니다. 그것은 정확히 말합니다 : 그것은 다음과 같이 문서화됩니다 : 폼의 드로잉 표면을 나타내는 Graphics 객체를 반환하는 것.

문제는 양식이 다시 그려됩니다 때마다 (많은 이유에 대해 일어날 수있는)에 Graphics 객체가 기본적으로를 다시 얻을 수 있다는 것입니다. 결과적으로, 당신이 얻은 모든 것으로 당신이 가져간 모든 것은 지워집니다.

양식은 처음 결코Load 이벤트 핸들러 방법으로 이해되지 않는다 때문에 CreateGraphics를 사용하여로드 될 때 항상 다시 그려집니다. 최소화되거나 복원되거나, 다른 창에 의해 덮히거나 심지어 (이 중 일부는 운영 체제, 그래픽 드라이버 및 양식의 속성에 따라 다름)의 크기가 재조정 될 때마다 다시 그릴 예정입니다.. 당신이 이 다시 그리기를 통해하지을 지속해야 사용자에게 즉시 피드백을 표시 할 때 CreateGraphics을 사용할 수 있습니다

유일한 시간이다. 예를 들어, MouseMove 이벤트의 핸들러에서 끌어서 놓기에 대한 피드백을 표시 할 때.

그래서 해결책은 무엇입니까? 항상 Paint 이벤트 처리기 메서드 내에서 드로잉 작업을 수행하십시오. 그런 식으로, "다시 그리기"는 기본적으로 Paint 이벤트를 발생시키기 때문에 다시 그리기를 통해 지속됩니다.

Paint 이벤트가 발생하면 PaintEventArgs 클래스의 인스턴스가 처리기에 전달되며 여기에는 그릴 수있는 Graphics 개체가 포함되어 있습니다.

그래서 여기에 코드 과 같아야 작업은 다음과 같습니다., 나는 OnPaint 방법을 무시하기보다는 해당 Paint 이벤트를 처리하고 위의 코드도

Public Class Form1 

    Protected Overridable Sub OnPaint(e As PaintEventArgs) 
     ' Call the base class 
     MyBase.OnPaint(e) 

     ' Do your painting 
     e.Graphics.DrawLine(Pens.Azure, 10, 10, 20, 20) 
    End Sub 

End Class 

(주 것을이 가장 잘 간주됩니다 파생 클래스에서 이벤트를 처리하는 연습. 그러나 어느 쪽이든 작동합니다.)

+0

안녕하세요 회색, 귀하의 조언을 주셔서 대단히 감사합니다. 문제 해결됨! –

+0

'Sub'의 끝 부분에서 여전히'MyBase.OnPaint (e)'를 호출해야합니다. 그렇지 않으면 나는 그것이 사건을 일으킬 것이라고 생각하지 않는다. –

+1

@Steven 네, 물론 그렇습니다. 내 벙어리 실수. 고침, 고마워. –

1

양식의 Paint 경우에이 코드를 삽입해야한다, 무슨 여기에 무슨 일이 일어나고하면 선이 그려되고 있다는이지만, 그렇게 당신의 라인이 사라로드가 완료 같은 형태로 다시 그림입니다. 또한 검정색 또는 대조 색을 사용하거나 양식의 창 배경색에 맞지 않게하십시오.

+0

가 더 폼 페인트 이벤트에 코드를 추가한다 더 간단한 해결책이 있습니다 당신 때문에 페인트 이벤트의 순서를 제어합니다. Paint 이벤트 핸들러를 사용하는 경우 복잡한 그래픽 상속 및 이벤트 배선과 같이 사용자 지정 그래픽이 그려지는 순서를 보장 할 수 없습니다. – Neolisk

+0

@Neolisk - 예, C#의 관점에서 '페인트'로만 생각했습니다. \ – kprobst

+0

@kprobst - C#에서는 Neolisk가 Paint 이벤트가 아닌 OnPaint 재정의를 나타내므로 OnPaint라고도합니다. –

0

폼에 그룹 상자 컨트롤을 추가하여이 작업을 수행 할 수 있습니다.그런 다음 텍스트 (빈 텍스트 유지)를 제거하고 높이를 1로 설정하고 원하는 BackColor를 선택하십시오.

+0

하지만이 질문은 본질적으로 대답하기는하지만 실제 코드를 추가하면 응답의 품질이 향상됩니다. –

1

당신은 당신의 라인을

Public Class Form1 
    Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint 
    Dim myPen As Pen 

    'instantiate a new pen object using the color structure 
    myPen = New Pen(Color=Color.Blue, Width=2) 

    'draw the line on the form using the pen object 
    e.Graphics.DrawLine(pen=myPen, x1=100, y1=150, x2=150, y2=100) 

    End Sub  
End Class 

을 끌기 위해이 작업을 수행해야하거나 OnPaint를 내부를 갖는

e.Graphics.DrawLine(Pens.Azure, 10, 10, 20, 20)