메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Gdi plus를 이용한 시계

데브카페

GDI+를 사용하여 아날로그 시계 및 달력 구현

#include <GDIPlus.au3>
#include <Date.au3>

Opt("MustDeclareVars", 1)

; GUI 생성
Local $iWidth = 400, $iHeight = 500
Local $hGUI = GUICreate("GDI+ Analog Clock", $iWidth, $iHeight)
GUISetState(@SW_SHOW, $hGUI)

; GDI+ 초기화
_GDIPlus_Startup()

; 캔버스 크기 설정
Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
Local $hCanvas = _GDIPlus_ImageGetGraphicsContext($hBitmap)

; 달력용 폰트 및 브러시 생성
Local $hFont = _GDIPlus_FontCreate("Arial", 12)
Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000) ; 검정색

; 메인 루프
While True
    Local $iMsg = GUIGetMsg()

    If $iMsg = -3 Then ExitLoop

    ; 시계 업데이트
    UpdateClock($hCanvas, $iWidth / 2, $iHeight / 3, 100)

    ; 달력 표시
    DrawCalendar($hCanvas, 50, 350, $hFont, $hBrush)

    ; 화면 새로고침
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight)
    Sleep(1000)
WEnd

; 자원 해제
_GDIPlus_FontDispose($hFont)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hCanvas)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()

Exit

; 함수: 시계 그리기
Func UpdateClock($hCanvas, $iCenterX, $iCenterY, $iRadius)
    ; 배경 지우기
    _GDIPlus_GraphicsClear($hCanvas, 0xFFFFFFFF) ; 흰색 배경

    ; 원 그리기
    Local $hPenCircle = _GDIPlus_PenCreate(0xFF000000, 3) ; 검정색 원
    _GDIPlus_GraphicsDrawEllipse($hCanvas, $iCenterX - $iRadius, $iCenterY - $iRadius, $iRadius * 2, $iRadius * 2, $hPenCircle)
    _GDIPlus_PenDispose($hPenCircle)

    ; 현재 시간 계산
    Local $aTime = _NowCalcArray()
    Local $iHour = $aTime[3]
    Local $iMinute = $aTime[4]
    Local $iSecond = $aTime[5]

    ; 초침, 분침, 시침 계산 및 그리기
    DrawClockHand($hCanvas, $iCenterX, $iCenterY, $iRadius * 0.9, $iSecond * 6, 0xFFFF0000, 2) ; 초침 (빨강)
    DrawClockHand($hCanvas, $iCenterX, $iCenterY, $iRadius * 0.7, $iMinute * 6, 0xFF0000FF, 4) ; 분침 (파랑)
    DrawClockHand($hCanvas, $iCenterX, $iCenterY, $iRadius * 0.5, ($iHour Mod 12) * 30 + $iMinute * 0.5, 0xFF00FF00, 6) ; 시침 (초록)
EndFunc

; 함수: 시계 바늘 그리기
Func DrawClockHand($hCanvas, $iCenterX, $iCenterY, $iLength, $iAngle, $iColor, $iThickness)
    Local $hPen = _GDIPlus_PenCreate($iColor, $iThickness)
    Local $fAngleRad = $iAngle * (3.14159 / 180) ; 각도를 라디안으로 변환
    Local $iX = $iCenterX + $iLength * Sin($fAngleRad)
    Local $iY = $iCenterY - $iLength * Cos($fAngleRad)
    _GDIPlus_GraphicsDrawLine($hCanvas, $iCenterX, $iCenterY, $iX, $iY, $hPen)
    _GDIPlus_PenDispose($hPen)
EndFunc

; 함수: 달력 표시
Func DrawCalendar($hCanvas, $iX, $iY, $hFont, $hBrush)
    ; 현재 날짜
    Local $sDate = _NowCalcDate()
    Local $sTime = _NowCalcTime()

    ; 날짜와 시간 텍스트
    _GDIPlus_GraphicsDrawString($hCanvas, "Date: " & $sDate, $hFont, $iX, $iY, $hBrush)
    _GDIPlus_GraphicsDrawString($hCanvas, "Time: " & $sTime, $hFont, $iX, $iY + 20, $hBrush)
EndFunc

{{틀:요약 1.GDI+ 초기화: • _GDIPlus_Startup()로 GDI+를 시작. • GUICreate로 GUI 창을 생성 후 GDI+로 화면을 그립니다.

2.시계 그리기: • UpdateClock 함수는 초침, 분침, 시침의 각도를 계산하고, 이를 DrawClockHand로 호출하여 그립니다. • 시침, 분침, 초침의 길이와 색상을 다르게 설정.

3. 달력 표시: • DrawCalendar 함수는 현재 날짜와 시간을 GDI+의 텍스트 출력 기능으로 표시합니다.

4.주기적 업데이트: • Sleep(1000)으로 1초마다 새로 그려 시계와 날짜를 실시간으로 업데이트.

5.자원 해제: • GDI+ 객체(Brush, Font, Graphics, 등`)를 사용한 뒤 반드시 해제해야 메모리 누수를 방지할 수 있습니다. }}

  • 확장 기능

1.배경 이미지 추가:

  • _GDIPlus_GraphicsDrawImage를 사용하여 배경 이미지를 추가할 수 있습니다.

2.사용자 입력:

  • 달력 날짜를 사용자 입력으로 변경할 수 있는 기능을 추가.

3.초침 애니메이션:

  • Sleep(1000) 대신 더 짧은 시간 간격(예: 100ms)으로 애니메이션 효과를 구현할 수 있습니다.

Comments