MFCの基礎 - タイマ

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

MFCにおいて、タイマのイベントハンドラを作成する手順および簡単なタイマイベントの発生と受付処理を行う手順を記載する。


イベントハンドラの追加

タイマのイベントハンドラを追加するため、クラスウィザードを使用する。

[プロジェクト]メニューバー – [クラスウィザード]を選択する。
[クラスウィザード]画面の[メッセージ]タブ - [メッセージ]欄からWM_TIMERを選択して、[ハンドラーの追加]ボタンを押下する。
OnTimerイベントハンドラが作成される。

以下のように、ヘッダファイルにイベントハンドラの宣言が追記される。

 afx_msg void OnTimer(UINT_PTR nIDEvent);


また、ソースファイルにイベントハンドラの実体および必要なMESSAGE_MAPも追記される。


サンプルコード

タイマを使用する方法は、以下の通りである。

  1. タイマを設定する。
  2. タイマのイベントハンドラが呼び出され、繰り返し処理を実行する。
  3. タイマの設定を解除する。


 // CSampleDialog.h
 
 class CSampleDialog : public CDialogEx
 {
 // ...
 
 private:
    // タイマ設定後の識別用ID
    // タイマの設定を解除する時に必要
    UINT m_timerID;
 
 // ...
 }


 // CSampleDialog.cpp
 
 // ダイアログの初期化のタイミング等でタイマを設定する
 // 設定後、タイマは有効になる(明示的な開始処理は存在しない)
 BOOL CSampleDlg::OnInitDialog()
 {
    // スーパークラスのメソッドを呼び出す
    CDialog::OnInitDialog();
    
    // タイマー設定時の識別用ID
    // 0以外の正整数を設定する
    // 複数のタイマを設定する場合、一意の値にする必要がある
    // 戻り値のタイマ設定後の識別用IDと値が異なることがある
    // そのため、タイマ設定時の識別用IDをタイマ設定後の識別用IDとして使用することはできない
    UINT timerID = 1;
 
    // 繰り返し処理を行う間隔(ミリ秒単位)
    // 例では5秒間隔にする
    UINT interval = 5 * 1000;
    
    // 繰り返し処理を行うハンドラを指定する
    // NULLを指定した場合、CWnd::OnTimerハンドラが呼び出される
    // そのためCWnd::OnTimerハンドラを実装し、繰り返し行う処理を記述する
    CALLBACK* timerHandler = NULL;
 
    // タイマの設定
    // タイマが設定できない場合、戻り値は0
    m_timerID = SetTimer(timerID, interval, timerHandler);
 
    // タイマを設定できない場合
    if (m_timerID == 0)
    {
       ::AfxMessageBox(_T("タイマを設定できませんでした。"));
    }
 }
 
 // SetTimerで設定した時間間隔で呼び出される
 void CSampleDlg::OnTimer(UINT nIDEvent)
 {
    // 設定したタイマの場合
    if(nIDEvent == m_timerID)
    {
       // 繰り返し行う処理を記述する
    }

    // スーパークラスのメソッドを呼び出す
    CDialog::OnTimer(nIDEvent);
 }
 
 // 画面が閉じられる場合等でタイマの設定を解除する
 void CSampleDlg::OnClose()
 {
    // タイマが設定されている場合
    if(m_timerID != 0)
    {
        // タイマーの設定を解除します。
        BOOL err = KillTimer(m_timerID);
        // タイマーの設定が解除できない場合
        if(!err)
        {
           ::AfxMessageBox(_T("タイマの設定を解除できませんでした。"));
        }
        m_timerID = 0;
    }
 
    // スーパークラスのメソッドを呼び出す
    CDialog::OnClose();
 }