Visual Basic 6.0 사용자를 위한 그래픽
업데이트: 2007년 11월
Visual Basic 6.0의 경우 다양한 그래픽 메서드와 속성을 사용하여 Form이나 PictureBox 컨트롤에서 그래픽을 그릴 수 있습니다. Visual Basic 6.0의 그래픽은 Windows GDI(그래픽 장치 인터페이스) API를 기반으로 합니다.
Visual Basic 2008에서는 GDI+ API를 캡슐화하는 System.Drawing 네임스페이스가 그래픽을 제공합니다. GDI+는 Visual Basic 6.0의 그래픽 기능을 토대로 확장된 것이지만 메서드가 호환되지는 않습니다.
개념적 차이
Visual Basic 6.0에서는 그래픽 메서드가 Form 개체와 PictureBox 컨트롤에만 적용됩니다.
Visual Basic 2008에서는 그래픽 메서드가 폼에 적용되고 PictureBox, Panel 및 GroupBox 컨트롤을 포함하여 Paint 이벤트를 지원하는 모든 컨트롤에 적용됩니다. 또한 ListView, TreeView 및 Button 컨트롤을 포함하여 OwnerDraw 속성을 지원하는 모든 컨트롤에도 적용됩니다.
AutoRedraw 속성
Visual Basic 6.0에서는 모든 이벤트 프로시저에서 그래픽 메서드를 호출할 수 있으며 AutoRedraw 속성을 사용하면 Paint 이외의 이벤트에서 그래픽 메서드를 호출한 경우 그래픽을 유지할 수 있습니다.
Visual Basic 2008에서는 Paint 이벤트 프로시저에서만 그래픽 메서드를 호출해야 합니다. 소유자가 그린 일부 컨트롤의 경우에는 다양한 Draw 이벤트 프로시저(DrawItem, DrawSubItem 등)에서만 그래픽 메서드를 호출해야 합니다. Paint 및 Draw 이벤트에서 그래픽을 자동으로 유지하기 때문에 AutoRedraw 속성은 더 이상 지원되지 않고 필요하지도 않습니다.
ClipControls 속성
Visual Basic 6.0에서는 ClipControls 속성을 사용하여 폼이나 컨트롤에서의 그리기 작업을 제어할 수 있습니다. 이를 True로 설정하면 새로 노출된 영역만 다시 그리기 때문에 이론상 성능이 향상됩니다.
Visual Basic 2008에는 ClipControls 속성에 해당하는 요소가 없습니다. GDI+ 및 최신 비디오 어댑터의 성능 향상으로 이러한 속성이 필요하지 않게 되었습니다.
DrawMode 속성
Visual Basic 6.0에서 DrawMode 속성은 패턴 위에 다른 패턴을 그릴 때 그래픽 개체의 색을 제어합니다. 이 속성은 단색 또는 저해상도 디스플레이(256색 이하)에만 영향을 줍니다.
Visual Basic 2008에는 DrawMode 속성에 해당하는 요소가 없지만 요즘에 사용되는 디스플레이에는 이 속성이 더 이상 필요하지 않습니다.
DrawStyle 속성
Visual Basic 6.0에서 DrawStyle 속성은 Line 메서드를 사용하여 그린 선의 모양을 제어합니다. DrawWidth 속성을 1보다 큰 값으로 설정하면 DrawStyle 속성이 적용되지 않고 선은 항상 실선이 됩니다.
Visual Basic 2008에서는 DrawLine 메서드 중 하나에 사용되는 System.Drawing.Pen 클래스의 DashStyle 속성을 설정하여 선 모양을 제어합니다. 선 두께는 이 속성과 관련이 없습니다.
DrawWidth 속성
Visual Basic 6.0에서는 DrawWidth 속성이 선 두께를 픽셀 단위로 결정합니다. 일반적으로 DrawWidth 속성은 그래픽 메서드를 수행하기 전에 설정됩니다.
Visual Basic 2008에서는 System.Drawing.Pen 컨트롤의 Pen.Width 속성이 선 두께를 결정합니다. Pen을 만들 때 또는 Pen을 만든 후에 Pen.Width를 설정하여 Width 속성을 매개 변수로 설정할 수 있습니다. Pen.Width 속성을 지정하지 않으면 기본값인 1픽셀이 사용됩니다.
Image 속성
Visual Basic 6.0에서는 폼 또는 PictureBox 컨트롤의 Image 속성에서 비트맵에 대한 핸들을 반환합니다. 반환된 핸들은 Picture 속성에 할당하거나 Windows API 호출에 전달할 값으로 사용할 수 있습니다.
Visual Basic 2008에서는 비트맵에 더 이상 핸들이 없으므로 실제 비트맵 자체가 Bitmap 형식의 개체로 전달됩니다. 전달된 Bitmap 컨트롤은 PictureBox 컨트롤의 Image속성에 할당할 수 있지만 Windows API 호출에는 전달할 수 없습니다.
Line 메서드
Visual Basic 6.0에서 Line 메서드는 선택적 인수인 B와 함께 왼쪽 위 및 아래쪽 좌표를 지정하여 사각형을 그리는 데 사용됩니다. FillColor 속성은 사각형을 단색으로 채우는 데 사용되고 FillStyle 속성은 교차 무늬로 채우는 데 사용됩니다.
Visual Basic 2008에서 DrawRectangles 메서드는 사각형의 테두리를 그리는 데 사용되고 FillRectangle 메서드는 사각형을 채우는 데 사용됩니다. FillRectangle에서는 Brush 개체를 매개 변수로 사용합니다. FillColor 속성은 SolidBrush로 대체되고 FillStyle 속성은 HatchBrush 클래스 멤버로 대체되었습니다.
Point 메서드
Visual Basic 6.0에서 폼 또는 PictureBox 컨트롤의 Point 메서드는 지정된 위치의 픽셀에 대한 색상 값을 반환하는 데 사용됩니다. Point 메서드는 그림이 포함되지 않은 폼이나 컨트롤에 사용할 수 있지만 일반적으로 Picture 속성에 할당된 비트맵에서 색을 검색하는 데 주로 사용됩니다.
Visual Basic 2008에는 Point 메서드가 더 이상 존재하지 않습니다. M:System.Drawing.Bitmap.GetPixel(System.Int32,System.Int32) 메서드를 사용하면 비트맵에서 색상 값을 검색할 수 있습니다. 그림이 포함되지 않은 폼이나 컨트롤의 경우에는 BackColor 속성을 쿼리할 수 있습니다.
Print 메서드
Visual Basic 6.0에서는 Print 메서드를 사용하여 폼 또는 PictureBox 컨트롤에 텍스트를 표시할 수 있습니다. 텍스트를 표시하는 데 사용되는 글꼴은 폼이나 컨트롤의 Font 속성에 의해 결정되고 색은 ForeColor 속성에 의해 결정됩니다. Print 메서드에서는 텍스트 위치를 제어할 수 없으며 텍스트를 가로로만 표시할 수 있습니다.
Visual Basic 2008에서는 텍스트를 표시하는 데 DrawString 메서드가 사용됩니다. 글꼴은 Font 개체에 의해 결정되고 색은 Brush 개체에 의해 결정됩니다. 두 개체 모두 DrawString 메서드에 매개 변수로 전달됩니다. DrawString 메서드에는 텍스트의 시작 위치를 결정하는 X 및 Y 매개 변수도 포함되어 있습니다. 또한 텍스트를 세로로 표시할 수 있도록 StringFormat 개체를 사용하는 선택적 Format 매개 변수도 포함되어 있습니다.
PSet 메서드
Visual Basic 6.0에서는 PSet 메서드를 사용하여 폼 또는 PictureBox 컨트롤의 픽셀 색을 변경할 수 있습니다. DrawWidth 속성을 1보다 큰 값으로 설정하면 PSet 메서드에서 채워진 원을 그립니다. 선택적 매개 변수를 사용하면 색을 지정할 수 있습니다. 이를 생략하면 ForeColor가 사용됩니다.
Visual Basic 2008에는 PSet 메서드에 해당하는 요소가 없습니다. 폼 또는 PictureBox 컨트롤의 단일 픽셀 색을 변경하려면 DrawEllipse 메서드를 사용하여 높이와 너비가 각각 1픽셀인 원을 그립니다. DrawWidth가 1보다 큰 경우에 PSet의 기능을 복제하려면 FillEllipse 메서드를 사용합니다.
그래픽에 대한 코드 변경 사항
다음 코드 예제에서는 Visual Basic 6.0의 코딩 기술과 Visual Basic 2008의 코딩 기술이 어떻게 다른지 보여 줍니다.
단선 그리기
다음 코드에서는 런타임에 폼에서 선을 그리는 방법을 보여 줍니다. Visual Basic 6.0 예제에서는 Line 메서드를 사용합니다. 이 메서드에서는 시작점과 끝점의 X 및 Y 좌표와 색(옵션)을 인수로 사용합니다. Visual Basic 2008 예제에서는 DrawLine 메서드를 사용합니다. 이 메서드는 Pens 개체와 시작점 및 끝점의 X 및 Y 좌표를 인수로 사용합니다.
참고: |
---|
Visual Basic 6.0의 기본 측정 단위는 트윕이고 Visual Basic 2008의 기본 측정 단위는 픽셀입니다. |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a solid black line 200 twips from the top of the form.
Line (0, 200) - (ScaleWidth, 200), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint(ByVal sender As Object, ByVal e _
As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a solid black line 25 pixels from the top of the form.
e.Graphics.DrawLine(Pens.Black, 0, 25, Me.Width, 25)
End Sub
점선 그리기
다음 코드에서는 런타임에 폼에서 점선을 그리는 방법을 보여 줍니다. Visual Basic 6.0 예제에서는 DrawStyle 속성이 선의 모양을 결정합니다. Visual Basic 2008 예제에서는 Pen 개체를 사용하고 DashStyle 속성을 설정하여 모양을 결정합니다.
참고: |
---|
Visual Basic 6.0의 기본 측정 단위는 트윕이고 Visual Basic 2008의 기본 측정 단위는 픽셀입니다. |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a dotted line 200 twips from the top of the form.
Me.DrawStyle = vbDot
Line (0, 200) - (ScaleWidth, 200), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint1(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a dotted black line 25 pixels from the top of the form.
Dim LPen As New System.Drawing.Pen(System.Drawing.Color.Black)
LPen.DashStyle = Drawing2D.DashStyle.Dot
e.Graphics.DrawLine(LPen, 0, 25, Me.Width, 25)
End Sub
선 두께 제어
다음 코드에서는 런타임에 폼에서 두께가 다른 선을 여러 개 그리는 방법을 보여 줍니다. Visual Basic 6.0 예제에서는 DrawWidth 속성이 사용됩니다. Visual Basic 2008 예제에서는 Pens 개체의 Width 속성을 사용합니다.
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a line with a thickness of 1 pixel.
DrawWidth = 1
Line (0, 200)-(ScaleWidth, 200), vbBlack
' Draw a line with a thickness of 5 pixels.
DrawWidth = 5
Line (0, 400)-(ScaleWidth, 400), vbBlack
' Draw a line with a thickness of 10 pixels.
DrawWidth = 10
Line (0, 600)-(ScaleWidth, 600), vbBlack
End Sub
' Visual Basic
Private Sub Form1_Paint2(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a line with a thickness of 1 pixel.
Dim TPen As New System.Drawing.Pen(System.Drawing.Color.Black, 1)
e.Graphics.DrawLine(TPen, 0, 25, Me.Width, 25)
' Draw a line with a thickness of 5 pixels.
TPen.Width = 5
e.Graphics.DrawLine(TPen, 0, 50, Me.Width, 50)
' Draw a line with a thickness of 10 pixels.
TPen.Width = 10
e.Graphics.DrawLine(TPen, 0, 75, Me.Width, 75)
End Sub
원 그리기
다음 코드에서는 런타임에 폼에서 원을 그리는 방법을 보여 줍니다. Visual Basic 6.0 예제에서는 Circle 메서드를 사용합니다. 이 메서드에서는 중점의 X 및 Y 좌표, 반지름 및 색(옵션)을 인수로 사용합니다. Visual Basic 2008 예제에서는 DrawEllipse 메서드를 사용합니다. 이 메서드는 Pen 개체, 경계 사각형 왼쪽 위 모퉁이의 X 및 Y 좌표, 너비 및 높이를 인수로 사용합니다.
참고: |
---|
Visual Basic 6.0의 기본 측정 단위는 트윕이고 Visual Basic 2008의 기본 측정 단위는 픽셀입니다. |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a 1000 twip diameter red circle
Circle (500, 500), 500, vbRed
End Sub
' Visual Basic
Private Sub Form1_Paint3(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a 70 pixel diameter red circle.
e.Graphics.DrawEllipse(Pens.Red, 0, 0, 70, 70)
End Sub
채워진 사각형 그리기
다음 코드에서는 런타임에 폼에서 단색으로 채워진 사각형과 교차 무늬로 채워진 사각형을 그리는 방법을 보여 줍니다. Visual Basic 6.0 예제에서는 FillColor 및 FillStyle 속성을 Line 메서드와 함께 사용합니다. B 매개 변수로 Line 메서드를 호출하면 사각형을 그릴 수 있습니다.
Visual Basic 2008 예제에서는 Brush 개체를 인수로 사용하는 Graphics.FillRectangle 메서드를 사용하고 Graphics.Rectangle 메서드를 사용하여 윤곽선을 그립니다. 이 예제에서는 SolidBrush 컨트롤과 HatchBrush 컨트롤을 모두 사용합니다.
참고: |
---|
Visual Basic 6.0의 기본 측정 단위는 트윕이고 Visual Basic 2008의 기본 측정 단위는 픽셀입니다. |
' Visual Basic 6.0
Private Sub Form_Paint()
' Draw a solid red rectangle.
FillColor = vbRed
FillStyle = vbSolid
Line (10, 10)- (1000, 500), vbRed, B
' Draw a rectangle filled with a crosshatch pattern.
FillColor = vbBlack
FillStyle = vbCross
Line (10, 500)- (1000, 1000), vbBlack, B
End Sub
' Visual Basic
Private Sub Form1_Paint4(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Draw a solid red rectangle.
Dim SBrush As New System.Drawing.SolidBrush _
(System.Drawing.Color.Red)
e.Graphics.DrawRectangle(Pens.Red, 2, 2, 70, 40)
e.Graphics.FillRectangle(SBrush, 2, 2, 70, 40)
' Draw a rectangle filled with a crosshatch pattern.
Dim HBrush As New System.Drawing.Drawing2D.HatchBrush( _
System.Drawing.Drawing2D.HatchStyle.Cross, _
System.Drawing.Color.Black, System.Drawing.Color.Transparent)
e.Graphics.DrawRectangle(Pens.Black, 2, 40, 70, 40)
e.Graphics.FillRectangle(HBrush, 2, 40, 70, 40)
End Sub
폼에 이미지 표시
다음 코드에서는 런타임에 폼에서 이미지를 표시하는 데 사용할 수 있는 그래픽 메서드를 보여 줍니다. Visual Basic 6.0 예제에서는 PaintPicture 메서드를 사용합니다. Visual Basic 2008 예제에서는 DrawImage 메서드를 사용합니다.
' Visual Basic 6.0
Private Sub Form_Paint()
' Create a stdPicture object.
Dim Pict1 As New stdPicture
Pict1 = LoadPicture("C:\Windows\Greenstone.bmp")
PaintPicture Pict1, 0, 0
End Sub
' Visual Basic
Private Sub Form1_Paint5(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
' Create a Bitmap object.
Dim Pict1 As New Bitmap("C:\Windows\Greenstone.bmp")
e.Graphics.DrawImage(Pict1, 0, 0)
End Sub
폼에 텍스트 표시
다음 코드에서는 런타임에 폼에서 텍스트 문자열을 표시하는 데 사용할 수 있는 그래픽 메서드를 보여 줍니다. Visual Basic 6.0 예제에서는 Print 메서드를 사용합니다. Visual Basic 2008 예제에서는 DrawString 메서드를 사용합니다.
' Visual Basic 6.0
Private Sub Form_Paint()
Me.Font.Size = 24
Me.Font.Bold = True
Me.ForeColor = vbRed
Print "Hello World!"
End Sub
' Visual Basic
Private Sub Form1_Paint6(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim TextFont As New System.Drawing.Font("Arial", 24, FontStyle.Bold)
Dim TextBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
e.Graphics.DrawString("Hello World!", TextFont, TextBrush, 10, 10)
TextFont.Dispose()
TextBrush.Dispose()
End Sub
문자열의 높이 및 너비 결정
다음 코드에서는 런타임에 폼에서 문자열의 크기를 확인한 다음 이 문자열 주위에 사각형을 그리는 데 사용할 수 있는 그래픽 메서드를 보여 줍니다. Visual Basic 6.0 예제에서는 TextHeight 및 TextWidth 메서드를 사용합니다. Visual Basic 2008 예제에서는 SizeF 구조체를 반환하는 MeasureString 메서드를 사용합니다.
' Visual Basic 6.0
Private Sub Form_Paint()
Me.Font.Size = 24
Me.Font.Bold = True
Me.ForeColor = vbRed
Print "Hello World!"
Line (0, 0)-(TextWidth("Hello World!"), _
TextHeight("Hello World!")), vbBlack, B
End Sub
' Visual Basic
Private Sub Form1_Paint7(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim TextFont As New System.Drawing.Font("Arial", 24, FontStyle.Bold)
Dim TextBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
e.Graphics.DrawString("Hello World!", TextFont, TextBrush, 10, 10)
Dim TextSize As New System.Drawing.SizeF
TextSize = e.Graphics.MeasureString("Hello World!", TextFont)
e.Graphics.DrawRectangle(Pens.Black, 10, 10, TextSize.Width, TextSize.Height)
TextFont.Dispose()
TextBrush.Dispose()
End Sub
단일 픽셀 그리기
다음 예제에서는 런타임에 폼에서 단일 픽셀의 색을 변경하는 데 사용할 수 있는 그래픽 메서드를 보여 줍니다. Visual Basic 6.0 예제에서는 PSet 메서드를 사용합니다. Visual Basic 2008 예제에서는 Height 및 Width 매개 변수를 1로 설정한 상태에서 DrawEllipse 메서드를 사용합니다.
참고 Visual Basic 6.0의 기본 측정 단위는 트윕이고 Visual Basic 2008의 기본 측정 단위는 픽셀입니다.
' Visual Basic 6.0
Private Sub Form_Paint()
Me.DrawWidth = 1
PSet (1000, 1000), vbRed
End Sub
' Visual Basic
Private Sub Form1_Paint8(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
e.Graphics.DrawEllipse(Pens.Red, 70, 70, 1, 1)
End Sub
단일 픽셀의 색 결정
다음 코드에서는 런타임에 폼에서 이미지의 지정된 위치에 있는 픽셀의 색을 확인한 다음 해당 색으로 채워진 사각형을 그리는 데 사용할 수 있는 그래픽 메서드를 보여 줍니다. Visual Basic 6.0 예제에서는 Point 메서드를 사용하여 색상 값을 검색합니다. Visual Basic 2008 예제에서는 GetPixel 메서드를 사용합니다.
참고: |
---|
Visual Basic 6.0의 기본 측정 단위는 트윕이고 Visual Basic 2008의 기본 측정 단위는 픽셀입니다. |
' Visual Basic 6.0
Private Sub Form_Paint()
Dim PixelColor As Long
Picture1.Picture = LoadPicture("C:\Windows\Greenstone.bmp")
PixelColor = Picture1.Point(10, 10)
FillColor = PixelColor
Line (0, 0)-(100, 500), PixelColor, B
End Sub
' Visual Basic
Private Sub Form1_Paint9(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim Pict1 As New Bitmap("C:\Windows\Greenstone.bmp")
Picture1.Image = Pict1
Dim PixelColor As Color = Pict1.GetPixel(4, 4)
Dim PixelBrush As New SolidBrush(PixelColor)
e.Graphics.FillRectangle(PixelBrush, 0, 0, 100, 100)
End Sub
그래픽 속성, 메서드에 해당하는 요소
다음 표에는 Visual Basic 6.0 그래픽 속성 및 메서드와 이에 해당하는 Visual Basic 2008의 요소가 나열되어 있습니다.
Visual Basic 6.0 |
동일한 기능의 Visual Basic 2008 요소 |
---|---|
AutoRedraw 속성 |
새롭게 구현되었습니다. 그래픽을 유지하려면 Paint 이벤트에 그래픽 메서드를 넣습니다. |
Circle 메서드 |
DrawEllipse 메서드 |
ClipControls 속성 |
새롭게 구현되었습니다. ClipControls 속성은 더 이상 필요하지 않습니다. |
Cls 메서드 |
Clear 메서드 |
CurrentX 속성 |
다양한 그래픽 메서드의 x 매개 변수. 예: DrawRectangle(pen, x, y, width, height) |
CurrentY 속성 |
다양한 그래픽 메서드의 y 매개 변수. 예: DrawRectangle(pen, x, y, width, height) |
DrawMode 속성 |
새롭게 구현되었습니다. DrawMode 속성은 더 이상 필요하지 않습니다. |
DrawStyle 속성 |
DashStyle 속성 |
DrawWidth 속성 |
Width 속성 |
FillColor 속성 |
SolidBrush 개체 |
FillStyle 속성 |
HatchBrush 개체 |
HasDC 속성 |
새롭게 구현되었습니다. GDI+에는 더 이상 디바이스 컨텍스트가 필요 없습니다. |
HDC 속성 |
새롭게 구현되었습니다. GDI+에는 더 이상 디바이스 컨텍스트가 필요 없습니다. |
Image 속성 |
새롭게 구현되었습니다. |
Line 메서드 |
DrawLine 메서드 |
PaintPicture 메서드 |
DrawImage 메서드 |
Point 메서드 |
해당 사항이 없습니다. 비트맵의 경우 Bitmap.GetPixel을 사용합니다. 폼이나 컨트롤의 경우 BackColor속성을 사용합니다. |
Print 메서드 |
DrawString 메서드 |
Pset 메서드 |
DrawEllipse, FillEllipse 메서드 |
TextHeight, TextWidth 속성 |
MeasureString 메서드 |
업그레이드 참고 사항
Visual Basic 6.0 응용 프로그램을 Visual Basic 2008로 업그레이드해도 그래픽 메서드는 업그레이드되지 않으며 코드에 경고가 삽입됩니다. GDI와 GDI+의 차이가 크기 때문에 기존의 모든 그래픽 코드를 다시 써야 합니다.