MZC4で無料Windowsアプリ開発

時計を作る

戻る | 前へ | 次へ


今回は、さらにダイアログを改造して時計を作りましょう。MyProject_res.rcをRisohEditorで開いて下さい。

今からダイアログからラベルを削除して、テキストボックス(EDITコントロール)を追加します。

ラベルを右クリックして、「削除」を選びます。ラベルが削除されます。

さらにダイアログを右クリックして「コントロールを追加」を選びます。 「コントロールの追加」ダイアログが表示されます。

[コントロールの追加]

「EDIT」をクリックして下さい。「ウィンドウ クラス名」が「EDIT」になります。 「ID」に「edt1」(イー、ディー、ティー、ワン)と入力して、「OK」をクリックして下さい。テキストボックスが追加されます。

[コントロールの追加2]

リソースを前回と同じようにエクスポートして下さい。

次にMyProject.cppを編集します。OnCommandメソッドを元に戻します。

    void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
    {
        switch (id)
        {
        case IDOK:
            EndDialog(IDOK);
            break;
        case IDCANCEL:
            EndDialog(IDCANCEL);
            break;
        }
    }

OnInitDialogメソッドを次のように変更します。

    BOOL OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
    {
        SendMessageDx(WM_SETICON, ICON_BIG, LPARAM(m_hIcon));
        SendMessageDx(WM_SETICON, ICON_SMALL, LPARAM(m_hIconSm));
        SetTimer(hwnd, 999, 1000, NULL);
        return TRUE;
    }

OnInitDialogは、ダイアログが作成される、一番最初のときに呼ばれます。「Init」というのは初期化(initialization)の略です。 SetTimerは、タイマーをセットするAPI関数です。これは、1000ミリ秒、すなわち1秒ごとにイベントが発生するタイマーです。

参考資料:MSDNのSetTimer

OnTimerメソッドを追加しましょう。MsgCrackで「OnTimer」と入力してコピーし、 MMainDlg内部に貼り付けましょう。

[OnTimerメソッドを追加]

OnTimerを次のように変更します。

    void OnTimer(HWND hwnd, UINT id)
    {
        SYSTEMTIME st;
        GetLocalTime(&st);

        TCHAR szText[32];
        StringCchPrintf(szText, _countof(szText), TEXT("%02u:%02u:%02u"), st.wHour, st.wMinute, st.wSecond);

        SetDlgItemText(hwnd, edt1, szText);
    }

GetLocalTime APIは、現在のローカルな時刻を取得する関数です。 SYSTEMTIME構造体は、日時を格納するための構造体です。 StringCchPrintfは、C言語のsprintfをより安全にした関数です。 バッファオーバーフローやNULLチェックをしてくれるので、sprintfよりも安全になっています。 Cchは、「Count of CHaracters」すなわち「文字数」を表しています。 _countofは、配列内の要素の個数を取得するマクロです。

参考資料: MSDNのSYSTEMTIMEMSDNのGetLocalTimeMSDNのStringCchPrintfMSDNのSetDlgItemTextMSDNのWM_TIMER

OnTimerメソッドを次のようにダイアログ プロシージャに登録します。

    virtual INT_PTR CALLBACK
    DialogProcDx(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
        HANDLE_MSG(hwnd, WM_INITDIALOG, OnInitDialog);
        HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
        HANDLE_MSG(hwnd, WM_TIMER, OnTimer);
        default:
            return DefaultProcDx();
        }
    }

前回と同じように、手動ビルドしましょう。

g++ -static -c -o MyProject.o MyProject.cpp
windres -i MyProject_res.rc -o MyProject_res.o
g++ -static -mwindows -o MyProject MyProject.o MyProject_res.o -lcomctl32

実行すると、時計になります。

[時計の完成]


© 2018 片山博文MZ. All Rights Reserved.

戻る | 前へ | 次へ

inserted by FC2 system