文書番号: 99198
最終更新日: 2003/07/21
ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateTime)ID_INDICATOR_TIME はオブジェクトでなく単なる ID なので、この作業を ClassWizard で行うことはできません。
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 回だけです。アプリケーションを実行し、ユーザーが一切の操作を行わない場合、次に何らかの新しいメッセージを受け取り、処理し、再びキューが空になる (新しいアイドル タイムが始まる) まで表示時刻は更新されません。
m_wndStatusBar.SetTimer(1, 1000, NULL);表示時刻を自動更新させる方法は複数ありますが、単純な方法はアプリケーションがコマンド UI ハンドラを呼び出すのは、メッセージ キューが空になるごとに一度だけであることを利用することです。CWnd::SetTimer により、アプリケーション キューに対して一秒ごとにメッセージが生成されます。ユーザーがアプリケーションを操作しなくても、タイマー イベントが処理された後にキューは空になり、新規のアイドル タイムが開始されステータス バーの時刻ペインが更新されます。ウィンドウ オブジェクトを破棄する際に、KillTimer を呼ぶのを忘れないでください。
UINT m_nIDTimer; static VOID __export CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT uIDEvent , DWORD dwTime);Win32 環境では __export キーワードは廃止されているため、バージョンによりコンパイラ警告 C4236 を発生しますが、__export キーワードを削除するだけで解決できます。
m_nIDTimer = ::SetTimer(NULL, 0, 1000, TimerProc);
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); }
::KillTimer(NULL, m_nIDTimer);
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