小弟初到csdn发贴子,望各位大虾多多关照。
我在一个mfc的单文档工程中出现这样一个问题:
  我在资源中创建两个工具条(其中一个是系统的IDR_MAINFRAME),在CMainFrame::OnCreate()中增加了以下代码: if (!m_cmbVideoBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_TOP|CBRS_TOOLTIPS,NULL))
{
return -1;
}
       //m_cmbVideoBar在MainFrm.h中声明为:CToolBar ,是自己创建的
       //IDR_TOOLBAR_VIDEOPRIVIEW --对应的资源。
m_cmbVideoBar.LoadToolBar(IDR_TOOLBAR_VIDEOPRIVIEW);
EnableWindow(FALSE);
EnableWindow();
m_cmbVideoBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_cmbVideoBar);       发现每次启动时程序运行到
LoadBarState(_T("Bar State Information"));
       语句时报错退出,如果屏蔽此语句,则不能实现界面中放置工具条在上次程序退出的位置。

解决方案 »

  1.   

    加载两个工具条,一个在左边(我新加的),你参考一下
    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\n");
    return -1;      // fail to create
    } //left toolbar
    if (!m_wndToolBarLeft.CreateEx(this,TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_BORDER_LEFT) ||
    !m_wndToolBarLeft.LoadToolBar(IDR_TOOLBARLEFT))
    {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
    } //button statusbar
    if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
      sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("Failed to create status bar\n");
    return -1;      // fail to create
    } // TODO: Delete these three lines if you don't want the toolbar to
    //  be dockable
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar); //LEFT toolbar
    m_wndToolBarLeft.SetWindowText("图象工具栏1");
    m_wndToolBarLeft.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBarLeft,AFX_IDW_DOCKBAR_LEFT);
    ShowControlBar(&m_wndToolBarLeft,TRUE,FALSE);
    int nColumns = 1;
    int nCount = m_wndToolBarLeft.GetToolBarCtrl().GetButtonCount();
    for (int i = 0; i < nCount; i++)
    {
    UINT nStyle = m_wndToolBarLeft.GetButtonStyle(i);
    BOOL bWrap = (((i + 1) % nColumns) == 0);
    if (bWrap)
    nStyle |= TBBS_WRAPPED;
    else
    nStyle &= ~TBBS_WRAPPED;
    m_wndToolBarLeft.SetButtonStyle(i, nStyle);
    }
      

  2.   

    试试这样:
    if (!m_cmbVideoBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_cmbVideoBar.LoadToolBar(IDR_TOOLBAR_VIDEOPRIVIEW))
    {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
    }
    区别只是LoadToolBar()的调用先后顺序。
      

  3.   

    //这样用:if ( VerifyBarState(_T("MyToolbar")) )
    {
      LoadBarState(_T("MyToolbar"));
    }
      

  4.   

    //声明:
    BOOL CMainFrame::VerifyBarState(LPCTSTR lpszProfileName)
    {
        CDockState state;
        state.LoadState(lpszProfileName);

        for (int i = 0; i < state.m_arrBarInfo.GetSize(); i++)
        {
            CControlBarInfo* pInfo = (CControlBarInfo*)state.m_arrBarInfo[i];
            ASSERT(pInfo != NULL);
            int nDockedCount = pInfo->m_arrBarID.GetSize();
            if (nDockedCount > 0)
            {
                // dockbar
                for (int j = 0; j < nDockedCount; j++)
                {
                    UINT nID = (UINT) pInfo->m_arrBarID[j];
                    if (nID == 0) continue; // row separator
                    if (nID > 0xFFFF)
                        nID &= 0xFFFF; // placeholder - get the ID
                    if (GetControlBar(nID) == NULL)
                        return FALSE;
                }
            }
            
            if (!pInfo->m_bFloating) // floating dockbars can be created later
                if (GetControlBar(pInfo->m_nBarID) == NULL)
                    return FALSE; // invalid bar ID
        }

        return TRUE;
    }