PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net | System.Drawing.Graphics

도형을 그린후 Paint이벤트가 발생할때 모두 사라져버린다

앞페이지에서 도형을 그린후 폼의 사이즈를
변화시키면 그렸던 도형이 사라진다
이것은 개체들의 Paint라는 이벤트가 작동되면 개체상에 그려졌던 도형이
사라지게 되어 있어서 그렇다..
예를 들어서 폼에 버튼을 하나 달고
버튼을 크릭하면 원이 하나 그려지게 한후
폼의 사이즈를 줄였다가 다시 본래의 크기로 돌아오면,
폼상에 그렸던 것은 사라진다..

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
	drawCircle()
End Sub
Sub drawCircle()
	Me.CreateGraphics.DrawEllipse(New Pen(Brushes.Black, 5), New Rectangle(New Point(20, 20), New Point(200, 200)))
End Sub

이것은 폼의 Paint이벤트에서 변했던 화면부분을 Refresh시켜버리기때문이다
아래와 같이 폼의 Paint이벤트가 발생할때마다
그렸던 것을 다시 그려 주어야 하는 셈이다
아래와 같이 하면 폼을 줄였다 늘렸다 해도 항상 그렸던 내용이 유지된다

Dim bDraw As Boolean

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
	drawCircle()
	bDraw = True
End Sub
''폼의 이벤트에서도 버튼에서 실행시켰던 프로시져를 호출하여 다시 그려준다
Private Sub Form2_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
	If bDraw Then
		drawCircle()
	End If
End Sub
Sub drawCircle()
	Me.CreateGraphics.DrawEllipse(New Pen(Brushes.Black, 5), New Rectangle(New Point(20, 20), New Point(200, 200)))
End Sub

실은 위와 같은 번거로움에 영향을 받지 않고 그리려면
PictureBox콘트롤을 사용하여
Graphic개체로 그리는 도형을 Image화일로 처리하면 간단하다
아래와 같이 일반적으로 Picturebox콘트롤에 image를 처리한다

Private Sub ButtonImage_Click(sender As System.Object, e As System.EventArgs) Handles ButtonImage.Click
''웹써버에 있는 그림화일을 다운 받아서 PicturBox콘트롤에 사용할때는
''System.Net 네임스페이스의 WebClient개체를 활용하여 간단하게 인터넷상의 그림을 표현할수 있다
''또한 그림화일은 Bitmap이라는 개체를 사용하여 PictureBox의 Image속성에 주면 된다
        Dim oWeb As New System.Net.WebClient
        Dim myImage As Bitmap = Bitmap.FromStream(New System.IO.MemoryStream(oWeb.DownloadData("https://i.pinimg.com/.....jpg")))

        PictureBox1.Image = myImage

End Sub

위와 같이 Bitmap 개체를 활용하여 이곳에 그림을 그리고
이것을 PictureBox콘트롤의 Image속성에 전달하면 ,
폼의 Paint이벤트등에 영향을 받지 않는다


''전역변수에 Bitmap타입변수와 Graphics타입의 변수를 선언하고
Private  myImage As Bitmap
Private myGraphic As Graphics

''원을 그리는 버튼을 크릭하면..
	''위에서 선언한 전역변수를 초기화하는 프로시져를 호출한다 
	setImage()
	
	Dim oLeftTop As Point
	Dim oBtmRight As Point

	For ix As Integer = 0 To 9
		For iy As Integer = 0 To 9
			oLeftTop = New Point(ix * 30 + 5, iy * 30 + 5)
			oBtmRight = New Point(30, 30)

			 myGraphic.DrawEllipse(New Pen(Color.Red, 3), New Rectangle(oLeftTop, oBtmRight))
		Next
	Next
	PictureBox1.Image = myImage
End Sub

Sub setImage()
	 myImage = New Bitmap(PictureBox1.Width, PictureBox1.Height)
	 myGraphic = Graphics.FromImage(myImage)

End Sub



아래의 화일을 실행하시면서 Paint이벤트와
PictureBox를 활용한 도형그리기를 잘 잡으시기를..

***[LOG-IN]***