今回は、さらにダイアログを改造して時計を作りましょう。MyProject_res.rcをRisohEditorで開いて下さい。
今からダイアログからラベルを削除して、テキストボックス(EDITコントロール)を追加します。
ラベルを右クリックして、「削除」を選びます。ラベルが削除されます。
さらにダイアログを右クリックして「コントロールを追加」を選びます。 「コントロールの追加」ダイアログが表示されます。
「EDIT」をクリックして下さい。「ウィンドウ クラス名」が「EDIT」になります。 「ID」に「edt1」(イー、ディー、ティー、ワン)と入力して、「OK」をクリックして下さい。テキストボックスが追加されます。
リソースを前回と同じようにエクスポートして下さい。
次に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を次のように変更します。
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のSYSTEMTIME、 MSDNのGetLocalTime、 MSDNのStringCchPrintf、 MSDNのSetDlgItemText、 MSDNの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
実行すると、時計になります。