- タイマーを使ってみよう -



OnTimer関数を使った簡単なプログラム考えてみて思いついたのがストップウォッチだったので今回はそれを作ってみます


≪ MFC・ダイヤログベースでの作成例 ≫


 ■ ダイヤログにスタティックテキストとボタンを作成



※TIMER:の横にある「*」はスタティックテキストです。IDはIDC_TIMERとします
※ボタンを画像の様に3つ作成。
 サンプルではIDを左からIDC_STARTIDC_STOPIDC_RESETとします





 ■ ダイヤログクラスにメンバー変数を追加





※ClassViewのダイヤログクラスを右クリックし、int型のメンバー変数 m_TimeData を作成






 ■ ClassWizardを呼び出しOnTimer関数と、作成した3つのボタンのクリックイベントを追加



※メッセージWM_TIMERを追加
※作成した3つのボタンのクリックイベントも追加する
※IDC_START → BN_CLICKED → 関数追加
※IDC_STOP  → BN_CLICKED → 関数追加
※IDC_RESET → BN_CLICKED → 関数追加





 ■ OnInitDialog関数で変数の初期化をする

////////////////////////////////////////
// CTest03Dlg メッセージ ハンドラ

BOOL CTest03Dlg::OnInitDialog()
{
CDialog::OnInitDialog();

// "バージョン情報..." メニュー項目をシステム メニューへ追加します。

// IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL) {
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty()) {
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
// ウィンドウがダイアログでない時は自動的に設定しません。
SetIcon(m_hIcon, TRUE); // 大きいアイコンを設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンを設定

// TODO: 特別な初期化を行う時はこの場所に追加してください。

//■メンバー変数の初期化
m_TimeData = 0;

return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}

※メンバー変数の初期化と、タイマーを動作させる為の初期設定をする。





 ■ OnTimer関数にソースを追加


void CTest03Dlg::OnTimer(UINT nIDEvent)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください

//int変数の有効範囲のチェック
if(m_TimeData < 32767){
//m_TimeDataのインクリメント
m_TimeData++;

//CString型変数iを作成
CString i;

//intからCStringにキャスト
i.Format("%d", m_TimeData);

//ダイヤログ更新
GetDlgItem(IDC_TIMER)->SetWindowText(i);

}
CDialog::OnTimer(nIDEvent);
}

※メンバー変数の有効範囲をチェックし有効範囲内なら1を足しダイヤログを更新




 ■ 3つのボタンにクリックイベントのソースを追加する

//★スタートボタンのクリックイベント
void CTest03Dlg::OnStart()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

//タイマーの設定
//※最初の引数 :1=タイマーID
//※2番目の引数:1000=1000ミリ秒=1秒
//※3番目の引数:長くなるのでMSDN等で調べてください。(^^;

SetTimer(1,1000,NULL);
}


//★ストップボタンのクリックイベント
void CTest03Dlg::OnStop()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

//タイマー止める ※引数はタイマーID
KillTimer(1);
}


//★リセットボタンのクリックイベント
void CTest03Dlg::OnReset()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

//タイマーデータを初期値0に戻す
m_TimeData = 0;

//CString型変数iを作成
CString i;

//int→CString
i.Format("%d", m_TimeData);

//ダイヤログ更新
GetDlgItem(IDC_TIMER)->SetWindowText(i);
}

※SetTimer関数はタイマーを動作させる為の関数、引数はコメント文参照
※KillTimer関数はタイマーを殺す為の関数、引数はタイマーID





 ■ 以上コンパイルすれば完成



※STARTボタンでタイマー開始、STOPボタンで一時停止、RESETボタンでタイマー値クリア