在界面上经常用到创建多个工具栏的情况,但MFC自动生成的代码只创建了一个工具栏,经过我摸索,创建多个工具栏应注意以下问题:
1.CMFCToolBarl类或其继承类对象创建应使用CreateEx()函数:
virtual BOOL CreateEx(
CWnd* pParentWnd, /* 父窗口,CFrameWndEx对象 */
DWORD dwCtrlStyle=TBSTYLE_FLAT,
DWORD dwStyle=AFX_DEFAULT_TOOLBAR_STYLE, /* 风格 */
CRect rcBorders=CRect(1, 1, 1, 1),
UINT nID=AFX_IDW_TOOLBAR /* 这里要注意,这个ID值并不是用工具栏资源的ID,而应该使用之前定义的uiFirstUserToolBarId值 */
);
这里的ID值,MFC自动生成时有如下定义:
const int iMaxUserToolbars = 10;
const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40;
const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1;
这个ID值按MSDN上解释:The ID of the child window of the toolbar.应该是工具栏的窗口的ID,并不是工具栏资源ID。
这里的这些资源ID应该属于BCG组件的内置给ToolBar使用的ID,因为AFX_IDW_CONTROLBAR_FIRST为AFX_IDW_TOOLBAR+40。
多个工具栏的话就顺序使用uiFirstUserToolBarId、uiFirstUserToolBarId+1.......。
InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);应该放在所有工具栏创建之前
2.对多个工具栏,启用自定义按钮的方法一样:
CString strCustomize;
bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
ASSERT(bNameValid);
// 允许用户定义的工具栏操作:
m_fileToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);
m_clientConnectToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);