タイトル

時間

タイトル

1,CTime
2,タイマー

1,CTime

時間を扱いクラスとしてCTimeクラスがあります。


void CTestView::OnDraw(CDC* pDC)
{
	CTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CString st;

	CTime t;
	t=CTime::GetCurrentTime();
	st=t.Format("%H:%M:%S");

	pDC->TextOut(0,0,st);

}

これは、t=CTime::GetCurrentTime()で現在の時間をtに代入しています。
t.Format("%H:%M:%S")でフォーマットを12:34:56のようなパターンにしています。
%xの部分がそっくり数字に入れ替わるわけです。
%xには次のような種類があります。
これを実行すると

%Y 年(4桁)
%y 年(2桁)
%B 月(例:August)
%b 月(例:Aug)
%m 月(1〜12)
%A 曜日(例:Saturday)
%a 曜日(例:Sat)
%d
%H
%M
%S

時間表示

時間を得る関数は次のようなものがあります。

関数 意味
CTime::GetDay( ) 日にち
CTime::GetDayWeek( ) 曜日 1:日曜 〜 7:土曜
CTime::GetHour( ) 時間 0〜23
CTime::GetMinute( ) 分 0〜59
CTime::GetMonth( ) 月 1〜12
CTime::GetSecond( ) 秒 0〜59
CTime::GetYear( ) 年(4桁) 1970〜2038

たとえば、


year=t.GetYear();

を実行すれば、データが得られます。

上上へ


2,タイマー

一定時間ごとに関数を呼び出すことができます。
これは、SetTimer関数とKillTimer関数を用います。
SetTimer関数は、一定時間ごとにOnTimer関数を実行するように
設定する関数で、KillTimer関数でそれを解除します。
SetTimerはWindowができた後に設定するのでここでは、OnCreate関数内で
設定します。(コントラスタ内ではできません。)
KillTimer関数もOnDestroy関数内におきます。
(デコントラスタ内ではできません。)

先ほどのプログラムを利用して応用します。
以下のようにメッセージハンドラをClassWizardでつくります。

クラス メッセージ メンバ関数
CNamaeView Windowが作成された OnCreate
CNamaeView Windowが破棄された OnDestroy
CNamaeView 一定の時間になった(WM_TIMER) OnTimer

void CTestView::OnDraw(CDC* pDC)
{
	CTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CString st;

	CTime t;
	t=CTime::GetCurrentTime();
	st=t.Format("%H:%M:%S");

	pDC->TextOut(0,0,st);

}
int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	SetTimer(1,1000,NULL);
	return 0;
}

void CTestView::OnDestroy() 
{
	CView::OnDestroy();
	
	KillTimer(1);
}

void CTestView::OnTimer(UINT nIDEvent) 
{
	CRect r(0,0,100,30);
	InvalidateRect(&r,TRUE);
	CView::OnTimer(nIDEvent);
}

SetTimerの最初の引数は0以外の数値を入れます。
2番目はどのぐらいの時間ごとに読み出すかを指定します。単位は[m sec]です。
3番目は、NULLにします。
KillTimerの引数はSetTimerの1番目の引数と同じ番号にします。

OnTimer関数で、時間になると特定の範囲の絵を消して、OnDraw関数を実行しています。

時間表示

これを実行すると先ほどと同じものが表示され数値が動きます。

上上へ


戻るC++のPageに戻る