Re[4]: 時刻表示


[コメントツリー表示を見る] [発言時刻順表示を見る]

Posted by 中瀬 on 2001/02/27 12:58:05

In Reply to: Re[3]: 時刻表示 Posted by Uz on 2001/02/19 05:18:13


    ありがとうございます。

    > なぜ、コンポーネントギャラリからステータスバーを
    > 追加する必要があったのでしょうか?
    > 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);
    > }
    >

    > ファイルを開くのダイアログを出してもちゃんと更新されてるよ。

    これだけでいけるんですか。
    コンポーネントギャラリから追加される長々しいコードは何のためでしょう。


記事スレッド一覧