前回予告したとおり、今日はWin32プログラミング講座 ~ Step32. アナログ時計を作る ~をGDI+で書くとどうなるかという話です。

例によって、比較のためGDI+に書き直したこと以外はそのままにしてあります。

Sub MainWnd_Paint(hdc As HDC)
    Dim graphics As Graphics(hdc)
    Dim pos As PointF
    Dim rc As RECT
    Dim CenterPos As PointF      '針の中心位置
    Dim Length_Second As Double  '秒針の長さ
    Dim Length_Minute As Double  '短針の長さ
    Dim Length_Hour As Long      '長針の長さ

    GetClientRect(hMainWnd, rc)

    '針の中心位置
    CenterPos.X = rc.right / 2
    CenterPos.Y = rc.bottom / 2

    'ウィンドウの大きさをもとに、秒針、短針、長針の長さを計算
    If rc.right > rc.bottom Then
        Length_Second = rc.bottom / 2 - 2
    Else
        Length_Second = rc.right / 2 - 2
    End If
    Length_Minute = Length_Second
    Length_Hour = Length_Minute * 0.70

    '短針
    If st.wHour = 12 Then st.wHour = 0
    Dim penMinute As Pen(Color.FromArgb(255, 100, 0), 5.0)
    pos.X = CenterPos.x + Length_Hour * Sin(st.wHour * PAI / 6 + st.wMinute * PAI / 360)
    pos.Y = CenterPos.y - Length_Hour * Cos(st.wHour * PAI / 6 + st.wMinute * PAI / 360)
    graphics.DrawLine(penMinute, CenterPos, pos)

    '長針
    Dim penHour As Pen(Color.FromArgb(255, 0, 0), 2.0)
    pos.x = CenterPos.x + Length_Minute * Sin(st.wMinute * PAI / 30 + st.wSecond * PAI / 1800)
    pos.y = CenterPos.y - Length_Minute * Cos(st.wMinute * PAI / 30 + st.wSecond * PAI / 1800)
    graphics.DrawLine(penHour, CenterPos, pos)

    '秒針
    Dim penSecond As Pen(Color.FromArgb(255, 255, 255), 1.0)
    pos.x = CenterPos.x + Length_Second * Sin(st.wSecond * PAI / 30)
    pos.y = CenterPos.y - Length_Second * Cos(st.wSecond * PAI / 30)
    graphics.DrawLine(penSecond, CenterPos, pos)
End Sub

GDI+で直線を引くにはGraphicsクラスのDrawLineメソッドを使用します。この引数には直線に使うペンと開始座標・終了座標を指定します。また、CreatePen関数の呼出はPenクラスのコンストラクタに代わりました。色指定ではColorクラスの静的メソッドFromArgbを用いています。RGBしか指定していませんが、FromArgbです。

描画に関する事柄は、GDIがGDI+になっても根本的な概念はあまり違いが無いと思います。そうでなければこうも特に語ることが無いというはずがありません。今日はこれでおしまいです。次回の更新は1週間後の予定です。


スポンサード リンク

この記事のカテゴリ

  • ⇒ GDI+ (3) 線を引く