アナログ時計

<戻る

ここに載せてあるソースコードは、参考のために載せてあります

サンプルコードは、一番下にLZHとしてあります

このサンプルは、2000年の日経ソフトウェア5月号で掲載させていただきました
2001/6/18 - 微調整版を出しました。




Option Explicit

'--------
'微調整版
'--------------------------------------
'あるホームページで
'問題点(※)を指摘されたので修正をしました。
'sngDefixのところが追加修正部分です。
'--------------------------------------
'※「時針は分針の状態で刻々と変化しているし、
'    分針は秒針の状態で刻々と変化しているんですよね。」
'すなわち、
'「アナログの形をしたデジタル時計じゃん」
'ということです。



'--------------------------------------
' フォームをロードしました
'--------------------------------------
Private Sub Form_Load()
    
    'フォームの座標モードをピクセル単位にします
    Me.ScaleMode = vbPixels
    
    'TimerコントロールのTimerイベントの発生する
    '時間間隔を設定します(1秒間隔)
    Timer1.Interval = 1000
End Sub

'--------------------------------------
' タイマーイベントが発生しました
'--------------------------------------
Private Sub Timer1_Timer()
    Static varTimeOld   As Variant
    Dim varTime         As Variant
    Dim deg             As Double
    Dim sngWidth        As Single
    Dim sngHeight       As Single
    Dim sngRound        As Single
    Dim sngDefix        As Single
    Dim iSecond         As Integer
    Dim iMinute         As Integer
    Dim iHour           As Integer
    
    '現在の時間を代入します
    'Time関数を毎回参照していると
    '処理中に時間が進んでしまうで
    '値が変動しないようにするため代入しています
    varTime = Time
    
    '現在の時間と前に保存していた時間を見比べます
    '同じであれば、時間の針を動かす必要がないので、
    'このプロシージャから出ます
    If varTime = varTimeOld Then
        Exit Sub
    End If
    '再度、時間を見比べるときに使います
    varTimeOld = varTime
    
    'SinやCosの引数をラジアン値に
    '変換するために使用する値の代入です
    deg = 3.14159265358979 / 180
    
    '秒、分、時間を代入します
    iSecond = Second(varTime)
    iMinute = Minute(varTime)
    '24時間周期を12時間周期にします
    iHour = Hour(varTime) Mod 12
    
    'Shapeコントロール(時計の枠)の幅を代入します
    sngWidth = Shape1.Width
    sngHeight = Shape1.Height
    
    '秒針の針を動かす
    '「iSecond * 6」の部分は、時計は60進数で動いているので
    '360/60 = 6、つまり1秒で6度進めばよいということになります。
    '「-90」にしているのは、X = Cos(0) で Y = Sin(0) の場合
    '時計で言うと3時の方向を示している事になるので
    '-90で12時の方向へ調整しています。
    '最後の「* 60」または「* 45」の部分は、針の長さを示しています。
    'Line3.X2とLine3.Y2を中心として針が動きます
    sngRound = (iSecond * 6 - 90) * deg
    Line3.X1 = Line3.X2 + Cos(sngRound) * 60
    Line3.Y1 = Line3.Y2 + Sin(sngRound) * 60
    
    '分針の針を動かす
    sngDefix = iSecond / 10 '分針は、60秒/6度 → 10秒に1度進みます
    sngRound = (iMinute * 6 - 90 + sngDefix) * deg
    Line2.X1 = Line2.X2 + Cos(sngRound) * 60
    Line2.Y1 = Line2.Y2 + Sin(sngRound) * 60
    
    '時針の針を動かす
    sngDefix = iMinute / 2 '時針は、60分/30度 → 2分に1度進みます
    sngRound = (iHour * 30 - 90 + sngDefix) * deg
    Line1.X1 = Line1.X2 + Cos(sngRound) * 45
    Line1.Y1 = Line1.Y2 + Sin(sngRound) * 45
    
End Sub


<戻る

Sample20.lzh


http://www.vector.co.jp/authors/VA015521/