ダイアログにツールバーをつける

MFCではダイアログボックスへのコントロールバー(ツールバーやステータスバー) の追加がサポートされていない。
ここで挙げる例はダイアログボックスにツールバーを追加する方法。 同じ手法でステータスバーも追加できるはず。
前準備
// ツールバー情報の構造体
struct	stToolBarInfo
{
    int     btnId;      // ボタンのID
    int     imgIdx;     // ボタンにつけるイメージのインデックス
    int     strId;      // ボタンに表示する文字列ID
};
CXXXDialogの準備
#define XXX_TBAR_BUTTON_NUM             4
const stToolBarInfo cstTBarInfo[XXX_TBAR_BUTTON_NUM] =
        { {ID_BUTTON_1,0,IDS_BUTTON_1},
          {ID_BUTTON_2,1,IDS_BUTTON_2},
          {ID_BUTTON_3,2,IDS_BUTTON_3},
          {ID_BUTTON_4,3,IDS_BUTTON_4} };
ダイアログボックスのOnCreate()関数内でツールバーを作成。
int
CXXXDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ・
    ・
    ・
    // ツールバーの作成
    BOOL bRet = m_wndToolBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_TOP,IDR_XXX_TOOLBAR);
    if(bRet == FALSE)
        return -1;

    // テキストはイメージの右側
    m_wndToolBar.ModifyStyle(0,TBSTYLE_LIST);
    // イメージのロード
    m_wndToolBar.LoadBitmap(IDB_XXX_TBAR_IMG);
    // ボタンの設定(後でSetButtonInfo()で設定するので数だけ設定)
    m_wndToolBar.SetButtons(NULL,XXX_TBAR_BUTTON_NUM);
    // ボタンのスタイル
    m_wndToolBar.SetBarStyle( m_wndToolBar.GetBarStyle()
                                &~CBRS_BORDER_TOP
                                | CBRS_BORDER_BOTTOM
                                &~CBRS_BORDER_RIGHT
                                &~CBRS_BORDER_LEFT      );
    // 各ボタンの設定
    for(int i=0;i<XXX_TBAR_BUTTON_NUM;i++){
        // ボタンのイメージのセット
        m_wndToolBar.SetButtonInfo(i,cstTBarInfo[i].btId,TBBS_BUTTON,cstTBarInfo[i].imgIdx);
        // ボタン文字列の設定
        CString str(_T(""));
        str.LoadString(cstTBarInfo[i].strId);
        m_wndToolBar.SetButtonText(i,(LPCTSTR)str);
    }

    // ペイントする前に更新ハンドラの呼び出しを無効
    m_wndToolBar.Invalidate();

    return 0;
}
ツールバーのサイズが0,0なのでリサイズ処理を追加。
void
CXXXDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);
    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
    ・
    ・
    // ツールバーのリサイズ処理
    // ダイアログのrect
    CRect   rcClient;
    GetClientRect(rcClient);
    // ツールバーの高さの取得
    CSize   sizeToolBar;
    sizeToolBar = m_wndToolBar.CalcFixedLayout(FALSE,TRUE);
    // 作成時は大きさが0なので設定する
    m_wndToolBar.MoveWindow(0,0,rcClient.Width(),sizeToolBar.cy);

    return;
}
これでダイアログにツールバーがつく。 しかしボタンがDisableのまま。 ON_UPDATE_COMMAND_UIでEnableにすれば良しと思いきや・・ 親がフレームじゃないとWM_IDLEUPDATECMDUIは処理されてない。
つうことでツールバークラスを派生させてダイアログ用ツールバークラスを作成し そいつのクラスでWM_IDLEUPDATECMDUIのメッセージハンドラをインプリ。
ちなみにWM_IDLEUPDATECMDUIはafxpriv.hで定義されてる。
/*****************************************************************************
DlgToolBar.cpp
ダイアログ用のツールバー
Copyright(c) 2003 IQ Company
*****************************************************************************/
#include "afxpriv.h"
#include "stdafx.h"
#include "DlgToolBar.h"

BEGIN_MESSAGE_MAP(CDlgToolBar,CToolBar)
    ON_MESSAGE(WM_IDLEUPDATECMDUI,OnIdleUpdateCmdUI)
END_MESSAGE_MAP()

LRESULT
CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam,LPARAM lParam)
{
    if(IsWindowVisible()){
        CFrameWnd*  pParent = (CFrameWnd*)GetParent();
        if(pParent){
            OnUpdateCmdUI(pParent,(BOOL)wParam);
        }
    }
    return 0L;
}
CXXXDlgクラスのメンバm_wndToolBarをCToolBarからCDlgToolBarに変更。 これでON_UPDATE_COMMAND_UIが処理できる。
(Apl 30,2003)
Previous<<   ∧index   >>Next
Back to home
メールはこちらから