本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSVC] CStatusBar ペインに現在時刻を表示する方法

文書番号: 99198

最終更新日: 2003/07/21


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP99198

概要



この資料は、MFC AppWizard ベース アプリケーションのステータス バーに現在時刻を表示する1 つの方法を紹介したものです。

詳細

以下の手順により表示できます。

  1. アプリケーションのストリング テーブルを編集。 リソースの編集には Visual C++ 1.0 1.51 では App Studio を使用し、Visual C++ 2.0 以降では統合環境のリソース エディタを使用します。ID_INDICATOR_NUM などが定義されているセグメントに新しい文字列を ID_INDICATOR_TIME などの ID 名で追加し、キャプションには 00:00 などを指定。ステータス バーは、指定された初期値を元にペインのサイズを計算します。アプリケーションは、必要に応じて CStatusBar::SetPaneInfo 関数により動的にペインのサイズを変更できます。編集後、リソース ファイルを保存。
  2. MAINFRM.CPP ファイルを編集。 ID_INDICATOR_TIME インジケータを、indicators 配列の目的に応じた位置に挿入。CStatusBar オブジェクトは indicators[] 配列の内容と順序に従いステータス バーを作成します。この時点でビルドされたプログラムでは、新しいペインは作成されますが Visual C++ 2.0 以前では初期値は表示されません。
  3. CMainFrame オブジェクトのメッセージ マップに以下のコードを追加。(ClassWizard コメント デリミタである AFX_MSG_MAP の外に記述)
          ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateTime)
    
    ID_INDICATOR_TIME はオブジェクトでなく単なる ID なので、この作業を ClassWizard で行うことはできません。
  4. CMainFrame クラスに以下のプロテクト メンバ関数を追加。
         void CMainFrame::OnUpdateTime(CCmdUI *pCmdUI)
         {
             CTime t = CTime::GetCurrentTime();
             char szTime[6];
             int nHour = t.GetHour();
             int nMinute = t.GetMinute();
    
             // Base Hours on 12 instead of 24
             if (nHour > 12)
                 nHour = nHour - 12;
    
             wsprintf(szTime, "%i:%02i", nHour, nMinute);
    
             // Now set the text of the pane.
             m_wndStatusBar.SetPaneText(
                 m_wndStatusBar.CommandToIndex(ID_INDICATOR_TIME), LPCSTR(szTime));
             pCmdUI->Enable();
         }
    
    この関数はプリケーションのアイドル時に呼び出されます。アプリケーションのメッセージ キューが空になるたびに、MFC プライベート Windows メッセージ WM_IDLEUPDATECMDUI が送られます。(アイドル タイムに関する詳細は、MFC テクニカルノート 24、または CWinApp::OnIdle 関数リファレンスを参照してください。) コマンドのユーザー インターフェイス アイテムを有効にするために、アプリケーションは pCmdUI->Enable 関数を呼び出さなければなりません。アプリケーションがユーザー インターフェイス アイテムを有効にしないと、ステータス バーにはペインのみ表示され、文字列は表示されません。この時点でプビルドされたプログラムのステータス バーのペインには現在時刻が表示されますが、問題が残されています。アプリケーションがコマンド UI ハンドラを呼び出すのはシステムがアイドルになるごとに 1 回だけです。アプリケーションを実行し、ユーザーが一切の操作を行わない場合、次に何らかの新しいメッセージを受け取り、処理し、再びキューが空になる (新しいアイドル タイムが始まる) まで表示時刻は更新されません。
  5. CMainFrame::OnCreate メンバ関数に以下のコードを追加。
      m_wndStatusBar.SetTimer(1, 1000, NULL);
表示時刻を自動更新させる方法は複数ありますが、単純な方法はアプリケーションがコマンド UI ハンドラを呼び出すのは、メッセージ キューが空になるごとに一度だけであることを利用することです。CWnd::SetTimer により、アプリケーション キューに対して一秒ごとにメッセージが生成されます。ユーザーがアプリケーションを操作しなくても、タイマー イベントが処理された後にキューは空になり、新規のアイドル タイムが開始されステータス バーの時刻ペインが更新されます。ウィンドウ オブジェクトを破棄する際に、KillTimer を呼ぶのを忘れないでください。

詳細

アプリケーションからモーダル ダイアログ ボックスを表示すると、ダイアログ マネージャがアプリケーションのメッセージ キューを管理します。ダイアログ マネージャのメッセージ ループはアイドル タイム処理を呼び出さないので、先述の OnUpdateTime 関数は呼ばれなくなります。モーダル ダイアログを表示した状態で、ステータス バーに表示した時刻を更新するにはメッセージ キューの使用を避けなければなりません。以下は対策例の手順です。

  1. 先述の手順 5 までを実装
  2. CMainFrame クラスに以下のメンバ変数を追加。
         UINT m_nIDTimer;
         static VOID __export CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT uIDEvent
    , DWORD dwTime);
    
    Win32 環境では __export キーワードは廃止されているため、バージョンによりコンパイラ警告 C4236 を発生しますが、__export キーワードを削除するだけで解決できます。
  3. CMainFrame::OnCreate 関数におけるタイマ呼び出しを修正。
         m_nIDTimer = ::SetTimer(NULL, 0, 1000, TimerProc);
    
  4. タイマー プロシージャを追加。
         VOID __export CALLBACK CMainFrame::TimerProc(HWND hwnd, UINT uMsg,
                                                      UINT uIDEvent, DWORD dwTime)
         {
             CMainFrame *pMainWnd = (CMainFrame *)AfxGetApp()->m_pMainWnd;
             ASSERT(uIDEvent == pMainWnd->m_nIDTimer);
    
             CCmdUI cui;
             cui.m_nID = ID_INDICATOR_TIME;
             cui.m_nIndex = 4;
             cui.m_pMenu = NULL;
             cui.m_pOther = &pMainWnd->m_wndStatusBar;
    
             pMainWnd->OnUpdateTime(&cui);
         }
    
  5. CMainFrame クラスのデストラクタでタイマを取り消す。
      ::KillTimer(NULL, m_nIDTimer);

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 99198 (最終更新日 1997-12-12) をもとに作成したものです。

Keywords: kbdss KBHOWTO VC10 VC15 VC20 VC40 VC41 VC42 VC4x VC50 KB99198
Technology: kbAudDeveloper kbMFC kbvc100 kbvc150 kbVC151 kbVC152 kbVC16bitSearch kbVC200 kbVC210 kbVC32bitSearch kbVC400 kbVC500 kbVC500Search kbVC600 kbVCsearch

inserted by FC2 system