In Command with Command Bars
命令条控件就是一个工具条 , 它看起来像是菜单条 , 并且展开其子菜单可见相应子菜单项旁边有与之对应的工具条图标贴图 . 从头编写命令条是件很痛苦的事 , 如果你是 MFC 程序员 , Paul Dilascia 已经在 ” January 1998, MSJ (Give Your Applications the Hot New Interface Look with Cool Menu Buttons ). ” 为你做了这件事 , 同样的 , 如果你是 WTL 程序员 , 你需要做的仅仅是在 WM_CREATE 消息映射函数中实例化一个 CCommandBarCtrl 类对象而已 :
LRESULT CMainFrame::OnCreate(UINT, WPARAM, LPARAM, BOOL&)
{
// m_CmdBar is of type CCommandBarCtrl, defined in AtlCtrlw.h
HWND hWndCmdBar = m_CmdBar.Create(m_hWnd, rcDefault,
0, ATL_SIMPLE_CMDBAR_PANE_STYLE);
// Let command bar replace the current menu
m_CmdBar.AttachMenu(GetMenu());
m_CmdBar.LoadImages(IDR_MAINFRAME);
SetMenu(NULL);
// First create a simple toolbar
HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd,
IDR_MAINFRAME,FALSE,ATL_SIMPLE_TOOLBAR_PANE_STYLE);
// Set m_hWndToolBar member
CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);
// Add a band to the rebar represented by m_hWndToolBar
AddSimpleReBarBand(hWndCmdBar);
// Add another band to the m_hWndToolBar rebar
AddSimpleReBarBand(hWndToolBar, NULL, TRUE);
// Create the usual statusbar
CreateSimpleStatusBar();
return 0;
}
WTL 的 CCommandBarCtrl 类封装了命令条控件所有功能 , CMainFrame 拥有一个 CCommandBarCtrl 类对象的数据成员 m_CmdBar . 在 WM_CREATE 消息映射函数中 , 我们先调用 CCommandBarCtrl::Create() , 并传递主框架窗口句柄作为其父窗口 . 然后 , 调用 CCommandBarCtrl::AttachMenu() 用命令条控件取代旧式的菜单条并关联到菜单资源 , CCommandBarCtrl::LoadImages() 装载工具条图标资源 , 命令条控件把工具条上所有的各位图资源映射到相应的菜单命令 ID 上 . 由于命令条控件取代了菜单并接管了菜单命令 , 我们需要把旧式的菜单条丢弃 , 调用 SetMenu(NULL) 正是为此 . 接下来 , CreateSimpleToolBarCtrl() 利用工具条资源创建工具条控件 , CreateSimpleRebar() 创建一个复合控件 ( Rebar ), 通过 CFrameWindowImplBase::AddSimpleRebarBand() 把命令条和工具条设置为复合控件的两个区间 ( band ). Figure 5b 展示了具有命令条的 SDI 应用程序 , 可以看出上述代码是如何完成 UI 元素的绘制 .
Figure 5b SDI Application with Command Bars
A Frame with a View
To be continued···