ダイアログにステータスバーを実装する

Visual C++プログラミングのメモ

【Visual C++ 2008】【MFC】

 ステータスバークラス(CStatusBar)を使用して、ダイアログにステータスバーを実装する方法。

  • ステータスバーに任意の文字列を表示する
  • サイズ変更可能なダイアログの場合、右下に斜線が入る

が可能になる。

(1)
 ダイアログのクラスヘッダのprivateに、ステータスバーと高さのメンバ変数定義を追加する。 ただし、ダイアログのサイズを変更しない場合は、高さのメンバ変数は不要。


    // ステータスバー
    CStatusBar m_wndStatusBar;

    // ステータスバーの高さ
    LONG heightStatusBar;

(2)
 OnInitDialogの「// TODO: 初期化をここに追加します。」より後にて、ステータスバーを読み込む。


    if (!m_wndStatusBar.Create(this))
    {
        // ステータスバー作成失敗
        //
        //
        //

        return TRUE;
    }

    // ステータスバーのインジケータ設定
    // (ステータスバーに文字列を表示しない場合、インジケータ設定は不要)
    static UINT idArray[] =
    {
        ID_SEPARATOR
    };

    m_wndStatusBar.SetIndicators(idArray, _countof(idArray));

    // ステータスバーの高さ取得
    // CRectクラスのメンバ変数bottomに高さが入っている
    // (ダイアログのサイズを変更しない場合、heightStatusBarに代入不要)
    CRect rectStatusBar;
    m_wndStatusBar.GetWindowRect(&rectStatusBar);
    heightStatusBar = rectStatusBar.bottom;

    // ダイアログのサイズを取得
    CRect rectDialog;
    GetClientRect(&rectDialog);

    // ダイアログの一番下にステータスバーを表示
    // (ダイアログのサイズを変更しない場合、heightStatusBarの代わりにrectStatusBar.bottomを使用)
    m_wndStatusBar.MoveWindow(0, rectDialog.bottom - heightStatusBar,
        rectDialog.Width(), heightStatusBar);

(3)
 ステータスバーに文字列を表示するには、以下の通り。


    m_wndStatusBar.SetWindowText(CString文字列);

(4)
 サイズ変更可能なダイアログの場合、CWnd::OnSizeをオーバーライドする。 詳しくは 「リストビューのサイズをダイアログのサイズ変更に合わせる」 を参照のこと。


void CXxxxDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);

    // OnSizeは、OnInitDialog前に一度呼ばれる。
    // その時点では、ステータスバーのウィンドウハンドルはNULLである。
    if (IsWindow(m_wndStatusBar.GetSafeHwnd()))
    {
        // ダイアログに合わせてステータスバーの位置変更。
        // ここで、heightStatusBarを使用する。
        m_wndStatusBar.MoveWindow(0, cy - heightStatusBar, cx, heightStatusBar);
    }

    return;
}

(メモ)

  • MSDNライブラリの「CStatusBar」「CRect」「CWnd::GetWindowRect」「CWnd::GetClientRect」 「CWnd::MoveWindow」「CWnd::SetWindowText」「CWnd::OnSize」「IsWindow」「CWnd::GetSafeHwnd」 を参照のこと