바로
이것
!
Hand 클래스 코드:
Public MustInherit 클래스 Hand
Protected gp As GraphicsPath = New GraphicsPath()
Protected gpBase As GraphicsPath = 없음
Protected midX As Integer = 150 '기본 형식
Protected midY As Integer = 150 'Center position
' 생성자, Center position 형식 가져오기
p>
Public Sub New(ByVal theForm As Form1)
midX = (theForm.ClientRectangle.Left theForm.ClientRectangle.Right) / 2
midY = (theForm.ClientRectangle .Top theForm.ClientRectangle.Bottom) / 2
End Sub
MustOverride Sub Transform(ByVal d As DateTime)
'포인터 경로 그리기
재정의 가능한 하위 그리기(ByVal g As Graphics)
Dim aPen As Pen = New Pen(Brushes.Black, 4F)
g.DrawPath(aPen, gp)
p>
g.FillPath(Brushes.Black, gp)
aPen.Dispose()
End Sub
'행렬 사용 회전 구현 경로(gp)
Public Sub Rotate(ByVal angle As Double)
gp = CType(gpBase.Clone(), GraphicsPath)
Dim mTransform As Matrix = New Matrix()
mTransform.RotateAt(CType(angle, Single), NewPointF(midX, midY))
gp.Transform(mTransform)
End Sub
End Class
공간을 절약하기 위해 위 코드에서는 네임스페이스를 소개하는 문을 생략했습니다.
다음은 분침(MinuteHand) 클래스의 정의입니다.
Public Class MinuteHand
Inherits Hand
'Constructor, 도면 분침 경로(gp) 생성
Public Sub New(ByVal myForm As Form1)
MyBase.New(myForm)
gp.AddLine(midX, midY, midX, 45)
gp.AddLine(midX, 45, midX - 3, 50)
gp.AddLine(midX - 3, 50, midX 3, 50) < /p>
gp.AddLine(midX 3, 50, midX, 45)
gpBase = CType(gp.Clone(), GraphicsPath)
End Sub
'Transform 메소드는 시스템의 현재 시간을 획득하고 시계 포인터를 회전시킵니다.
공개 재정의 하위 변환(ByVal d As DateTime)
Dim MinuteTime As Double = (CDbl(d.Minute) CDbl(d.Second / 60))
< p>어두운 각도 As Double = (CDbl(분시간) / 60) * 360Rotate(angle)
End Sub
End Class
포인터를 회전시키는 방법은 모든 포인터에 동일하므로 기본 클래스에 구현됩니다. 시침과 초침의 구현은 분침과 유사하므로 생성자에서 그리는 포인터 경로가 다르고 Transform 메서드에서 회전하는 각도가 다르다는 점만 다를 뿐이므로 가지 않겠습니다. 여기에 자세히 설명되어 있습니다.
또 하나 언급해야 할 점은 시계 문자판을 그리는 코드입니다. 시계 문자판은 ClockFace 클래스를 사용하여 구현됩니다. 이 클래스에서는 먼저 시계를 나타내는 원을 그린 다음 미키마우스 패턴을 그리고 마지막으로 해당 위치에 1부터 12까지의 숫자를 그려 12시간을 나타냅니다.
Public Sub Draw(ByVal g As Graphics)
DrawClockFace(g)
DrawImage(g)
DrawNumbers(g) < /p>
DrawPin(g)
End Sub
다음은 ClockFace 클래스의 속성입니다:
Private ClockRectangle As Rectangle
Private ClockFont As Font = New Font("Arial", 12)
Private midPoint As Point
Private ClockImage As Bitmap
Private Const IMAGEX As Integer = 50
Private Const IMAGEY As Integer = 50
DrawClockFace 메소드는 시계 표면을 그리는 데 사용됩니다:
Private Sub DrawClockFace(ByVal g As Graphics )
g.FillEllipse(Brushes.White, ClockRectangle.Left 10, ClockRectangle.Top 10, ClockRectangle.Width - 20, ClockRectangle.Height - 20)
g.DrawEllipse(펜 .Black, ClockRectangle.Left 10, ClockRectangle.Top 10, ClockRectangle.Width - 20, ClockRectangle.Height - 20)
End Sub
그런 다음 Graphics 개체의 DrawImage 메서드를 사용하세요. 미키 마우스 그림을 그리려면:
Private Sub DrawImage(ByVal g As Graphics)
Dim nWidth As Integer = ClockImage.Width
Dim nHeight As Integer = ClockImage.Height
Dim destRect As Rectangle = New Rectangle(midPoint.
End Sub
시계에서 숫자의 위치는 sin 및 cos 함수를 사용하여 계산됩니다.
Private Sub DrawNumbers(ByVal g As Graphics)
Dim count As Integer = 1
Dim a As Double
For a = 0 ~ 2 * Math.PI 2단계 * Math.PI / 12
Dim x As Double = (ClockRectangl
e.Width - 70) / 2 * Math.Cos(a - Math.PI / 3) (ClockRectangle.Width - 70) / 2 25
Dim y As Double = (ClockRectangle.Width - 70) / 2 * Math.Sin(a - Math.PI / 3) (ClockRectangle.Width - 70) / 2 20
g.DrawString(Convert.ToString(count), ClockFont, Brushes.Black, CType (x, Single), CType(y, Single), New StringFormat())
count = 1
다음
End Sub
< p>마지막으로 양식 파일(Form1.vb):Public Class Form1
System.Windows.Forms.Form을 상속합니다.
Private MyMinuteHand As MinuteHand < /p>
MyHourHand를 HourHand로 비공개
MySecondHand를 SecondHand로 비공개
TheClockFace를 ClockFace로 비공개
FirstTick을 Boolean = False로 비공개
< p>'양식의 OnPaint 이벤트에서 그래픽 개체 가져오기Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
If (FirstTick = False) 그런 다음 Sub를 종료합니다.
Dim g As Graphics = e.Graphics
TheClockFace.Draw(g)
MyHourHand.Draw(g)
MyMinuteHand.Draw(g)
MySecondHand.Draw(g)
TheClockFace.DrawPin(g)
End Sub
' 타이밍 이벤트 인수
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)가 Timer1.Tick 처리
MySecondHand.Transform(DateTime.Now)
MyHourHand.Transform(DateTime.Now)
MyMinuteHand.Transform(DateTime.Now)
FirstTick = True
무효화()