1,CTime |
2,タイマー |
時間を扱いクラスとして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();
を実行すれば、データが得られます。
一定時間ごとに関数を呼び出すことができます。
これは、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に戻る