複数のツールバー メニューと連携

ツールバーとメニュー
ツールバーを目的別に分けてみた.前回の状態を復元するようにした.
さらに,それをメニューから操作できるようにした.

複数のツールバー :
ポイントは,ツールバーのオブジェクトを 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()

たぽ
  • たぽ
  • カレン(ST206 3S-GE VVT-i)、BRZ(ZC6 RAエアコン有)でサーキットを走ってます。
    クルマ弄りは基本的にDIY。そのため(?)にガレージ付きの家建てました。

    数年前から登山にも目覚め、時々アウトドアな日記・動画もアップしてます。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください