時間の取得


時計を作る

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 構造体へのポインタを指定します




前のページへ戻る次のページへ