如题,MFC 创建的单文档,我想自定义工具栏,因此把程序生成的有关工具栏的代码全隐掉了,添加上了自己的代码,是通过ImageList逐个添加图标的。创建采用的是myToolBar.create(this)菜单栏没有动过,调试通过之后,发现图标能出来,但被菜单栏遮住了一半,求大神怎么解决?先谢过了

解决方案 »

  1.   

    See :CWnd::RepositionBars
      

  2.   

    看看你的 Create 代码
      

  3.   

    想不出为什么要“把程序生成的有关工具栏的代码全隐掉了”?只要修改一下就可以使用自己的ToolBar,你要自己写代码前也需要先完全搞清原代码每一句的作用。
      

  4.   

    想不出为什么要“把程序生成的有关工具栏的代码全隐掉了”?只要修改一下就可以使用自己的ToolBar,你要自己写代码前也需要先完全搞清原代码每一句的作用。您说的很对,可是原来的代码是采用一次添加一排图标的方法,而我希望的是一个图标一个的添加,这样利于后期维护,还有,原来代码用的是CMFCToolBar类,而网上的多用的是CToolBar类,两者很多地方都不同
      

  5.   

    "看看你的 Create 代码"
      

  6.   


    我是基本将原来的代码都注释掉了,自己制作工具栏的代码在CreateExToolBar里,可是奇怪的是我将原来代码里的制作菜单栏的代码注释掉是图1,不注释,也就是沿用它原来的菜单栏代码,却是图2,明显工具栏挡住了菜单栏
      

  7.   

    这个是原来的代码,大部分都被我注释掉了:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
    return -1; //创建扩展工具栏
    if (!this->CreateExToolBar())
    return -1;
    //BOOL bNameValid;
    //// 基于持久值设置视觉管理器和样式
    //OnApplicationLook(theApp.m_nAppLook); if (!m_wndMenuBar.Create(this))
    {
    TRACE0("未能创建菜单栏\n");
    return -1;      // 未能创建
    } m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY); //// 防止菜单栏在激活时获得焦点
    //CMFCPopupMenu::SetForceMenuFocus(FALSE); //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(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
    //{
    // TRACE0("未能创建工具栏\n");
    // return -1;      // 未能创建
    //} //CString strToolBarName;
    //bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
    //ASSERT(bNameValid);
    //m_wndToolBar.SetWindowText(strToolBarName); //CString strCustomize;
    //bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
    //ASSERT(bNameValid);
    //m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); //// 允许用户定义的工具栏操作:
    //InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId); if (!m_wndStatusBar.Create(this))
    {
    TRACE0("未能创建状态栏\n");
    return -1;      // 未能创建
    }
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); //// TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行
    //m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
    //m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    //EnableDocking(CBRS_ALIGN_ANY);
    //DockPane(&m_wndMenuBar);
    //DockPane(&m_wndToolBar);
    //// 启用 Visual Studio 2005 样式停靠窗口行为
    //CDockingManager::SetDockingMode(DT_SMART);
    //// 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为
    //EnableAutoHidePanes(CBRS_ALIGN_ANY); //// 加载菜单项图像(不在任何标准工具栏上):
    //CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0); //// 创建停靠窗口
    //if (!CreateDockingWindows())
    //{
    // TRACE0("未能创建停靠窗口\n");
    // return -1;
    //} //m_wndFileView.EnableDocking(CBRS_ALIGN_ANY);
    //m_wndClassView.EnableDocking(CBRS_ALIGN_ANY);
    //DockPane(&m_wndFileView);
    //CDockablePane* pTabbedBar = NULL;
    //m_wndClassView.AttachToTabWnd(&m_wndFileView, DM_SHOW, TRUE, &pTabbedBar);
    //m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
    //DockPane(&m_wndOutput);
    //m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);
    //DockPane(&m_wndProperties);
    //// 启用工具栏和停靠窗口菜单替换
    //EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR); //// 启用快速(按住 Alt 拖动)工具栏自定义
    //CMFCToolBar::EnableQuickCustomization(); //if (CMFCToolBar::GetUserImages() == NULL)
    //{
    // // 加载用户定义的工具栏图像
    // if (m_UserImages.Load(_T(".\\UserImages.bmp")))
    // {
    // CMFCToolBar::SetUserImages(&m_UserImages);
    // }
    //} //// 启用菜单个性化(最近使用的命令)
    //// TODO: 定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。
    //CList<UINT, UINT> lstBasicCommands; //lstBasicCommands.AddTail(ID_FILE_NEW);
    //lstBasicCommands.AddTail(ID_FILE_OPEN);
    //lstBasicCommands.AddTail(ID_FILE_SAVE);
    //lstBasicCommands.AddTail(ID_FILE_PRINT);
    //lstBasicCommands.AddTail(ID_APP_EXIT);
    //lstBasicCommands.AddTail(ID_EDIT_CUT);
    //lstBasicCommands.AddTail(ID_EDIT_PASTE);
    //lstBasicCommands.AddTail(ID_EDIT_UNDO);
    //lstBasicCommands.AddTail(ID_APP_ABOUT);
    //lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR);
    //lstBasicCommands.AddTail(ID_VIEW_TOOLBAR);
    //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003);
    //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005);
    //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE);
    //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER);
    //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK);
    //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA);
    //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7);
    //lstBasicCommands.AddTail(ID_SORTING_SORTALPHABETIC);
    //lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE);
    //lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS);
    //lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE); //CMFCToolBar::SetBasicCommands(lstBasicCommands); return 0;
    }
      

  8.   

    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示工具栏
    放 
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    中, 因为 
    CreateExToolBar() 后还有 bar
      

  9.   

    for(int i=0;i< ARRAY_MAX;i++)    //设置每个按钮属性
    {
    button[i].dwData=0;
    button[i].fsStyle=TBBS_BUTTON;
    button[i].iBitmap=i;
    button[i].idCommand =Resource[i]; //array[i] = Resource[i];
    }
    TBBUTTON Wrap;    //创建一个分隔条
    Wrap.dwData=0;
    Wrap.fsState=TBSTATE_ENABLED;
    Wrap.fsStyle=TBSTYLE_SEP;
    Wrap.iBitmap = 2;//宽度
    Wrap.idCommand =0;
    m_wndToolBar.GetToolBarCtrl().AddButtons(3/*ARRAY_MAX*/,button);
    // m_wndToolBar.GetToolBarCtrl().InsertButton(4,&Wrap);
    m_wndToolBar.GetToolBarCtrl().AutoSize(); //m_wndToolBar.GetToolBarCtrl().GetButton(5,&button[4]);
    button->iBitmap = 1; m_wndToolBar.SetSizes(CSize(40,37),CSize(31,31)); //设置按钮和按钮位图大小//函数第一个是按钮大小,第二个是图像大小,按钮必须比图像要大,具体是按钮的要 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示工具栏