複数のツールバー メニューと連携
ツールバーを目的別に分けてみた.前回の状態を復元するようにした.
さらに,それをメニューから操作できるようにした.
複数のツールバー :
ポイントは,ツールバーのオブジェクトを CreateEx() で生成するところ.
上のリンクでは Create() を使ってるが,VC++ 6.0 の AppWizard が生成するコードでは
CreateEx() を使っている.たぶん初期の状態↓
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar "); return -1; // 作成に失敗 } (ステータスバーは省略) // TODO: ツール バーをドッキング可能にしない場合は以下の3行を削除 // してください。 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);
まず変数名を適当に変えてずらずら連ねてみた.
if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar1.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar "); return -1; // 作成に失敗 } if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar2.LoadToolBar(IDR_TOOLS)) { TRACE0("Failed to create toolbar "); return -1; // 作成に失敗 } if (!m_wndToolBar3.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar3.LoadToolBar(IDR_DEBUG)) { TRACE0("Failed to create toolbar "); return -1; // 作成に失敗 } (ステータスバーは省略) // TODO: ツール バーをドッキング可能にしない場合は以下の3行を削除 // してください。 // 参考: http://www2s.biglobe.ne.jp/~maekawa/dev/vc/tips/lib/toolbar_possave.html m_wndToolBar1.SetWindowText("標準"); m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar2.SetWindowText("ツール"); m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar3.SetWindowText("デバッグ"); m_wndToolBar3.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar1); DockControlBar(&m_wndToolBar2); DockControlBar(&m_wndToolBar3);
↑これでステータスバーは3つ表示されたが,状態の保存がうまくいかない.
次は Create() を使ってみた.
if (!m_wndToolBar1.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, ID_TB_GENERAL) || !m_wndToolBar1.LoadToolBar(ID_TB_GENERAL)) { TRACE0("Failed to create toolbar "); return -1; // 作成に失敗 } if (!m_wndToolBar2.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, ID_TB_TOOLS) || !m_wndToolBar2.LoadToolBar(ID_TB_TOOLS)) { ...
↑うまくいった.しかしボタンのスタイルが旧式.
拡張スタイル TBSTYLE_FLAT が使えないからだろう.もうちょっと挑戦.
調べてみると Creatve(), CreateEx() の引数は次のとおり.
CToolBar::Create BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR ); CToolBar::CreateEx BOOL CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle = TBSTYLE_FLAT, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_TOOLBAR);
むむ,最後の引数のデフォルト値
AFX_IDW_TOOLBARが怪しい!
というわけで CreateEx() の最後の引数にそれぞれのツールバーのIDを渡してみた.↓
if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(0,0,0,0), ID_TB_GENERAL) || !m_wndToolBar1.LoadToolBar(ID_TB_GENERAL)) { TRACE0("Failed to create toolbar "); return -1; // 作成に失敗 } if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(0,0,0,0), ID_TB_TOOLS) || !m_wndToolBar2.LoadToolBar(ID_TB_TOOLS)) { ...
大成功!めでたしめでたし.
状態保存 :
このリンクにあるように,LoadBarState(“ToolBarState”); SaveBarState(“ToolBarState”); を使えばOK.
というか,これを実現するために前の項のような苦労をしたんだが….
あとはこのリンクと同じように,デフォルトでツールバーが横に並ぶようにしたいな….
ツールバーをメニューから操作 :
上のリンク先の説明はちょっと不十分.
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) // 追加分 ON_UPDATE_COMMAND_UI(コマンドID, CFrameWnd::OnUpdateControlBarMenu) ON_COMMAND_EX(コマンドID, CFrameWnd::OnBarCheck) END_MESSAGE_MAP()
ここで
コマンドIDと言ってるのは,メニューのID = ツールバーのID のようだ.
だから右上の画像の場合,標準 = ID_TB_GENERAL,ツール = ID_TB_TOOLS,
デバッグ = ID_TB_DEBUG として,次のようにするとメニューから操作できるようになった.
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ... ON_UPDATE_COMMAND_UI(ID_TB_GENERAL, CFrameWnd::OnUpdateControlBarMenu) ON_COMMAND_EX(ID_TB_GENERAL, CFrameWnd::OnBarCheck) ON_UPDATE_COMMAND_UI(ID_TB_TOOLS, CFrameWnd::OnUpdateControlBarMenu) ON_COMMAND_EX(ID_TB_TOOLS, CFrameWnd::OnBarCheck) ON_UPDATE_COMMAND_UI(ID_TB_DEBUG, CFrameWnd::OnUpdateControlBarMenu) ON_COMMAND_EX(ID_TB_DEBUG, CFrameWnd::OnBarCheck) END_MESSAGE_MAP()