초기 윈도우는 다음과 같습니다.
위와 같은 윈도우 이미지를 SetWindowRgn을 사용해서 원형으로 만들고 이미지를 입히고, 타이머에 따라 시간을 표시합니다.
다음 이미지는 실행 결과 입니다.
소스는 다음과 같습니다.
Option Explicit ' 모든 변수는 선언된 뒤에 사용 가능하다.
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Pos_x(1 To 60) As Double ' 초침 X 좌표
Private Pos_y(1 To 60) As Double ' 초침 Y 좌표
Private Pos_xx(1 To 60) As Double ' 분침 X 좌표
Private Pos_yy(1 To 60) As Double ' 분침 Y 좌표
Private Pos_xxx(1 To 12) As Double ' 시침 X 좌표
Private Pos_yyy(1 To 12) As Double ' 시침 Y 좌표
Private SecondColor As Long ' 초침 색
Private MinuteColor As Long ' 분침 색
Private HourColor As Long ' 초침 색
Private Sub Form_DblClick()
Me.Visible = False
Unload Me
End Sub
Private Sub Form_Load()
Const fwp = 105
Const fhp = 105
Dim CircleH As Long ' 원형 영역
Dim ForCounter As Long ' For Counter
Dim pi As Double ' 파이
pi = Atn(1) * 4 ' 파이 값
CircleH = CreateEllipticRgn(0, 0, 103, 102) ' 원 영역 생성
With Me
SetWindowRgn .hWnd, CircleH, True ' 원을 폼에 적용
.BackColor = vbBlack
.Picture = LoadPicture(VB.App.Path + "\clock.bmp")
.Move Screen.Width - (fwp + 10) * Screen.TwipsPerPixelX, _
10 * Screen.TwipsPerPixelY, _
fwp * Screen.TwipsPerPixelX, _
fhp * Screen.TwipsPerPixelY
.ScaleMode = vbPixels
End With
SecondColor = RGB(128, 128, 128)
MinuteColor = RGB(128, 64, 128)
HourColor = RGB(64, 128, 64)
For ForCounter = 1 To 60 ' 각 초를 가리키는 초침에 좌표
Pos_x(ForCounter) = 35 * Cos(-(pi / 2) + (ForCounter * (pi / 30)))
Pos_y(ForCounter) = 35 * Sin(-(pi / 2) + (ForCounter * (pi / 30)))
Next ForCounter
For ForCounter = 1 To 60 ' 각 분을 가리키는 분침에 좌표
Pos_xx(ForCounter) = 51 + 0.9 * Pos_x(ForCounter)
Pos_yy(ForCounter) = 50 + 0.9 * Pos_y(ForCounter)
Next ForCounter
For ForCounter = 1 To 12 ' 각 시를 가리키는 시침에 좌표
Pos_xxx(ForCounter) = 51 + 0.7 * Pos_x(ForCounter * 5)
Pos_yyy(ForCounter) = 50 + 0.7 * Pos_y(ForCounter * 5)
Next ForCounter
For ForCounter = 1 To 60 ' 각 초를 가리키는 초침에 좌표
Pos_x(ForCounter) = 51 + Pos_x(ForCounter)
Pos_y(ForCounter) = 50 + Pos_y(ForCounter)
Next ForCounter
End Sub
'
Private Sub Timer1_Timer()
Dim CurrentTime As Date
Dim Second As Long
Dim Minute As Long
Dim Hour As Long
Dim second_Prv As Long
Dim minute_Prv As Long
Dim hour_Prv As Long
Dim TempTime As Long
CurrentTime = Now
Second = VBA.Second(CurrentTime)
If Second = 0 Then Second = 60
second_Prv = Second - 1
If second_Prv = 0 Then second_Prv = 60
Minute = VBA.Minute(CurrentTime)
If Minute = 0 Then Minute = 60
minute_Prv = Minute - 1
If minute_Prv = 0 Then minute_Prv = 60
Hour = VBA.Hour(CurrentTime) Mod 12
If Hour = 0 Then Minute = 12
hour_Prv = Hour - 1
If hour_Prv = 0 Then hour_Prv = 12
DrawSecond second_Prv, False ' 이전 초를 지운다
If Second = 60 Then ' 초가 60초라면, 분침을 1 올리는 시간
DrawMinute minute_Prv, False
If Minute = 60 Then ' 분이 60 분이라면, 시침을 1 올리는 시간
DrawHour hour_Prv, False
End If
End If
DrawHour Hour, True ' 시침을 그린다
DrawMinute Minute, True ' 분침을 그린다
DrawSecond Second, True ' 초침을 그린다
End Sub
Private Sub DrawSecond(Second As Long, DrawType As Boolean) ' 초를 그린다
Me.Line (51, 50)-(Pos_x(Second), Pos_y(Second)), IIf(DrawType, SecondColor, vbWhite) ' 초를 그린다.
End Sub
Private Sub DrawMinute(Minute As Long, DrawType As Boolean) ' 분을 그린다
Dim Draw_Color As ColorConstants
Dim ForCounterI As Long
Dim ForcounterJ As Long
Draw_Color = IIf(DrawType, MinuteColor, vbWhite)
For ForCounterI = 50 To 52
For ForcounterJ = 49 To 51
Me.Line (ForCounterI, ForcounterJ)-(Pos_xx(Minute), Pos_yy(Minute)), Draw_Color
Next ForcounterJ
Next ForCounterI
End Sub
Private Sub DrawHour(Hour As Long, DrawType As Boolean) ' 시를 그린다
Dim Draw_Color As ColorConstants
Dim ForCounterI As Long
Dim ForcounterJ As Long
Draw_Color = IIf(DrawType, HourColor, vbWhite)
For ForCounterI = 50 To 52
For ForcounterJ = 49 To 51
Me.Line (ForCounterI, ForcounterJ)-(Pos_xxx(Hour), Pos_yyy(Hour)), Draw_Color
Next ForcounterJ
Next ForCounterI
End Sub
'API' 카테고리의 다른 글
마우스 커서를 포함한 스크린샷 (0) | 2011.09.16 |
---|---|
CombineRgn을 사용한 구멍 뚫린 윈도우 만들기 (0) | 2011.09.15 |
SetWindowRgn을 사용한 윈도우의 모양을 내 맘대로.. (0) | 2011.09.14 |
ShellExecutef를 사용한 파일에 연결된 프로그램 실행하기 (0) | 2011.09.14 |
CreateCompatibleDC를 활용한 이미지 개체의 DC를 얻기 (0) | 2011.09.14 |