ありがとうございます。
> なぜ、コンポーネントギャラリからステータスバーを > 追加する必要があったのでしょうか? > MFCのSDIアプリって最初のスケルトンに既にステータスバー > ついてますよね。
ステータスバー自身はついてますが、追加したかったのはそのペインです。 コンポーネントギャラリからステータスバーを追加すると、 次のようなコードが追加されます。
ON_UPDATE_COMMAND_UI(ID_INDICATOR_DATE, OnUpdateDate) ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateTime)
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { : // CG: 次のブロックは「ステータス バー」コンポーネントにより追加されています。 { // AppWizard の定義したスタティック変数 'indicators' のサイズを // 調べて保存します。 int nOrigSize = sizeof(indicators) / sizeof(UINT);
UINT* pIndicators = new UINT[nOrigSize + 2]; memcpy(pIndicators, indicators, sizeof(indicators));
// ステータス バー コンポーネントのステータス バー作成ルーチンを呼び出します。 if (!InitStatusBar(pIndicators, nOrigSize, 1)) { TRACE0("Failed to initialize Status Bar\n"); return -1; } delete[] pIndicators; } }
BOOL CMainFrame::InitStatusBar(UINT *pIndicators, int nSize, int nSeconds) { // CG: この関数は「ステータス バー」コンポーネントにより追加されています。
// 日付ペイン用のインデックスを作成します。 m_nDatePaneNo = nSize++; pIndicators[m_nDatePaneNo] = ID_INDICATOR_DATE; // 時刻ペイン用のインデックスを作成します。 m_nTimePaneNo = nSize++; nSeconds = 1; pIndicators[m_nTimePaneNo] = ID_INDICATOR_TIME;
// TODO: アイドル中にステータス バーを更新する際の // 適切なインターバル値を設定してください。 m_wndStatusBar.SetTimer(0x1000, nSeconds * 1000, NULL);
return m_wndStatusBar.SetIndicators(pIndicators, nSize);
}
void CMainFrame::OnUpdateTime(CCmdUI* pCmdUI) { // CG: この関数は「ステータス バー」コンポーネントにより追加されています。
// 現在の時刻を取得し、書式にしたがって変換します。 CTime time = CTime::GetCurrentTime(); CString strTime = time.Format(_T("%X"));
// BLOCK: 時刻文字列の幅を計算します。 CSize size; { HGDIOBJ hOldFont = NULL; HFONT hFont = (HFONT)m_wndStatusBar.SendMessage(WM_GETFONT); CClientDC dc(NULL); if (hFont != NULL) hOldFont = dc.SelectObject(hFont); size = dc.GetTextExtent(strTime); if (hOldFont != NULL) dc.SelectObject(hOldFont); }
// 現在の時刻を反映するようにペインを更新します。 UINT nID, nStyle; int nWidth; m_wndStatusBar.GetPaneInfo(m_nTimePaneNo, nID, nStyle, nWidth); m_wndStatusBar.SetPaneInfo(m_nTimePaneNo, nID, nStyle, size.cx); pCmdUI->SetText(strTime); pCmdUI->Enable(TRUE);
}
> OnCreateでSetTimerして、OnCloseでKillTimer、 > OnTimerで更新。 > > void CMainFrame::OnTimer(UINT nIDEvent) > { > m_wndStatusBar.SetPaneText(0, CTime::GetCurrentTime().Format("%H:%M:%S")); > > CFrameWnd::OnTimer(nIDEvent); > } >
> ファイルを開くのダイアログを出してもちゃんと更新されてるよ。
これだけでいけるんですか。 コンポーネントギャラリから追加される長々しいコードは何のためでしょう。
|