SetWindowRgn로 폼(윈도우)를 원형으로 만든다음 시계 이미지를 윈도우에 입히고, 타이머를 돌려서 현재 시간에 대한 내용을 초침,분침,시침으로 표시합니다.

초기 윈도우는 다음과 같습니다.


위와 같은 윈도우 이미지를 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

+ Recent posts