第22章 ダイアログボックスに時刻表示


さて、前回までの解説で次のようなことに気がつきませんでしたか。

ダイアログボックスに時計を表示できないか?

スクロールバーを動かすとリアルタイムでその数値を 表示できましたね。同じ理屈で時刻も表示できるはずです。 今回は、普通の?ウィンドウ(親ウィンドウ)は必要ないので WinMain関数から、いきなり DialogBox関数を呼び出します。親のウィンドウは作りません。

えっ!そんなことして大丈夫なの!?

はい。大丈夫です。 では、やってみましょう。

// dialog02.cpp #include <windows.h> #include <windowsx.h> #include <time.h> #include <string.h> #include "resource.h" #define ID_MYTIME 32767 LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); int SetTimeStr(HWND); int SetStrDlg(char *str); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { DialogBox(hCurInst, "MYDIALOG", NULL, (DLGPROC)DlgProc); return 0; }

WinMain関数はたったこれだけです。前回やったマクロを使いますので windowsx.hを忘れずにインクルードして下さい。また、時間関係の 関数を使いますのでtime.hもインクルードして下さい。

今回も、リソース・エジタにヘッダーファイルを任せているので "resource.h"をインクルードしています。

(これが嫌な人、または使えない環境の人のために後でヘッダーファイルと リソース・スクリプトを書いておきます。)

DialogBox関数の3番目の引数は、親ウィンドウがないのでNULLです。

次は、ダイアログ・プロシージャです。

LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_INITDIALOG: SetTimer(hWnd, ID_MYTIME, 1000, NULL); return TRUE; case WM_TIMER: SetTimeStr(hWnd); return TRUE; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wp, lp)) { case IDOK: if (MessageBox( hWnd, (LPCTSTR)"終了しても良いですか", (LPCTSTR)"終了確認", MB_OKCANCEL | MB_ICONQUESTION) == IDCANCEL) { return FALSE; } KillTimer(hWnd, ID_MYTIME); EndDialog(hWnd, IDOK); return TRUE; } break; } return FALSE; }

WM_INITDIALOGのところで、SetTimer関数を呼び出しています。1秒に1回だけ WM_TIMERメッセージを出すようにセットしておきます。

タイマーは、EndDialog関数が呼ばれる、つまりダイアログボックスが 終了する直前に殺して(KillTimer)おきます。

WM_TIMERメッセージを捕まえたら、SetTimeStr(自作)関数を呼んで ダイアログボックスに新しい時刻表示をします。

WM_COMMANDメッセージを捕まえたら、さらにボタンIDで場合分けするのですが 今回は、マクロを使ってみました。windowsx.hのなかで

#define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp)

のように定義されています。

では、自作関数のSetTimeStr関数を見てみましょう。

int SetTimeStr(HWND hWnd) { time_t long_time; struct tm *now_time; char dlg_hour[6], dlg_min[6], dlg_sec[6], dlg_ampm[6]; time(&long_time); now_time = localtime(&long_time); if (now_time->tm_hour > 12) { now_time->tm_hour -= 12; strcpy(dlg_ampm, "午後"); } else { strcpy(dlg_ampm, "午前"); } wsprintf(dlg_hour, "%2d", now_time->tm_hour); wsprintf(dlg_min, "%2d", now_time->tm_min); wsprintf(dlg_sec, "%2d", now_time->tm_sec); Static_SetText(GetDlgItem(hWnd, IDC_HOUR), dlg_hour); Static_SetText(GetDlgItem(hWnd, IDC_MIN), dlg_min); Static_SetText(GetDlgItem(hWnd, IDC_SEC), dlg_sec); Static_SetText(GetDlgItem(hWnd, IDC_AMPM), dlg_ampm); return 0; }

現在時刻を取得して、Static_SetTextマクロで ダイアログボックスに表示しています。 今回は、簡単でしたね。ダイアログボックスにも時計を 表示できることがわかりました。また、ダイアログボックスを 単独で(親ウィンドウなしで)作ることもできるということがわかりました。

ダイアログボックスに刻々と時刻が表示されてします。 終了ボタンを押すと、終了確認メッセージボックスが出現します。


それでは、リソース・スクリプトを示します。

// dialog02.rc #include <windows.h> #include "dialog02.h" ///////////////////////////////////////////////////////////////////////////// // // Dialog // MYDIALOG DIALOG DISCARDABLE 0, 0, 134, 51 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "猫でもわかる時計" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "終了",IDOK,48,23,37,14 LTEXT "午後",IDC_AMPM,13,7,15,8 LTEXT "",IDC_HOUR,34,7,11,8 LTEXT "時",IDC_STATIC,51,7,8,8 LTEXT "",IDC_MIN,65,7,11,8 LTEXT "分",IDC_STATIC,82,7,8,8 LTEXT "",IDC_SEC,96,7,11,8 LTEXT "秒",IDC_STATIC,108,7,8,8 END


自前でヘッダーファイルを作る人は、

IDC_AMPM, IDC_HOUR, IDC_SECを自分でdefineしておいて下さい。


[SDK Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Apr/20/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。