時間の取得
時計を作る
ANSI C標準 コンパイラであれば、システム時間を取得することができますが
時間をプログラムから設定するなどは API を使わなければいけません
なにより、Win32 API を使っているのだから、そこから時間を取得するべきでしょう
Win32 では、時間は SYSTEMTIME 構造体で表されます
この構造体は、次のような定義になっています
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;
wYear は年、wMonth は月(1月 = 1)
wDayOfWeek は曜日で日曜日から 0、月曜日は 1 というように表します
wDay は現在日、wHour は現在時、wMinute は現在分
wSecond は現在秒、wMilliseconds は現在のミリ秒となります
時間を取得するには GetLocalTime() 関数にこの構造体のポインタを渡します
すると、この関数は構造体の各メンバにそれぞれのデータを格納します
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
lpSystemTime には、SYSTEMTIME 構造体のポインタを指定します
後は、この構造体のメンバから欲しい情報を取り出せばよいのです
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
RECT rctSize;
SYSTEMTIME stTime;
static TCHAR strTime[128];
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
SetTimer(hwnd , 1 , 300 , NULL);
return 0;
case WM_TIMER:
GetLocalTime(&stTime);
wsprintf(strTime , "%d年 %d月 %d日\n%d時 %d分 %d秒" ,
stTime.wYear , stTime.wMonth , stTime.wDay ,
stTime.wHour , stTime.wMinute , stTime.wSecond
);
InvalidateRect(hwnd , NULL , TRUE);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd , &ps);
GetClientRect(hwnd , &rctSize);
DrawText(hdc , strTime , -1 , &rctSize , DT_LEFT);
EndPaint(hwnd , &ps);
}
return DefWindowProc(hwnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return -1;
hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hwnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
return msg.wParam;
}
現在時刻を表示します
もちろん、リアルワールドの時間と同じかどうかはユーザーの設定にかかっています
同様の方法で GetSystemTime() 関数を用いれば
協定世界時 UTC を取得することもできます
GetLocalTime()
VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);
現在のローカル日時を取得します
lpSystemTime - 時間を格納する SYSTEMTIME 構造体へのポインタを指定します
GetSystemTime()
VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
現在の協定世界時 UTC を取得します
lpSystemTime - 時間を格納する SYSTEMTIME 構造体へのポインタを指定します