会话之间未正确恢复CMFCToolbar布局 [英] CMFCToolbar layout not restored properly between sessions

查看:159
本文介绍了会话之间未正确恢复CMFCToolbar布局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在与其中工具栏的位置不被正确会话之间恢复了CMFCToolbar类的问题。



下面是一个屏幕截图如何工具栏在应用关闭前排列:





以下是重新启动应用程式时如何还原工具列的画面:





请注意,第一个工具列上方出现较大的空白,现在第二个工具栏是主工具栏,而不是它下面的权利。



我是有我的应用程序的问题,所以我生成使用应用程序向导这个测试程序,然后我手动添加第二个工具栏。



我想知道这是否是因为有什么我做错了,或者如果它只是由于bug



<$>

以下是我的CMainFrame类的代码,用于设置工具栏:

  int CMainFrame :: OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CFrameWndEx :: OnCreate(lpCreateStruct)== -1)
return -1;

BOOL bNameValid;

//设置视觉经理用来绘制所有用户界面元素
CMFCVisualManager :: SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));

//设置视觉样式中使用的由视觉经理
CMFCVisualManagerOffice2007 ::的SetStyle(CMFCVisualManagerOffice2007 :: Office2007_LunaBlue);

if(!m_wndMenuBar.Create(this))
{
TRACE0(无法创建menubar \\\
);
return -1; //无法创建
}

m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle()| CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);

//防止菜单栏将重点放在激活
CMFCPopupMenu :: SetForceMenuFocus(FALSE);

如果(m_wndToolBar.CreateEx(这一点,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(无法创建toolbar\ n);
return -1; //无法创建
}

CString strToolBarName;
bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_​​STANDARD);
ASSERT(bNameValid);
m_wndToolBar.SetWindowText(strToolBarName);

m_wndToolBar.EnableTextLabels();

如果(m_wndToolBar2.CreateEx(这一点,TBSTYLE_FLAT,WS_CHILD |!WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |!CBRS_SIZE_DYNAMIC)||
m_wndToolBar2.LoadToolBar(IDR_TOOLBAR))
{
TRACE0(无法创建toolbar2\\\
);
return -1; //无法创建
}

CString strCustomize(Toolbar2);
m_wndToolBar2.EnableCustomizeButton(TRUE,ID_VIEW_CUSTOMIZE,strCustomize);

//允许用户定义的工具栏操作:
InitUserToolbars(NULL,uiFirstUserToolBarId,uiLastUserToolBarId);

if(!m_wndStatusBar.Create(this))
{
TRACE0(无法创建状态栏\\\
);
return -1; //无法创建
}
m_wndStatusBar.SetIndicators(indicator,sizeof(indicators)/ sizeof(UINT));

// TODO:如果你不希望工具栏和菜单栏可以停靠,请删除这五行。
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(& m_wndMenuBar);
DockPane(& m_wndToolBar);
DockPane(& m_wndToolBar2);


//启用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(无法创建对接窗口\\\
);
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);


//启用工具栏和停靠窗口菜单替换
EnablePaneMenu(TRUE,ID_VIEW_CUSTOMIZE,strCustomize,ID_VIEW_TOOLBAR);

//启用快速(Alt +拖动)工具栏自定义
CMFCToolBar :: EnableQuickCustomization();

if(CMFCToolBar :: GetUserImages()== NULL)
{
//加载用户定义的工具栏图像
if(m_UserImages.Load(_T .\\UserImages.bmp)))
{
m_UserImages.SetImageSize(CSize(16,16),FALSE);
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. AdddTail(ID_APP_EXIT);
lstBasicCommands.AddTail(ID_EDIT_CUT);
lstBasicCommands.AddTail(ID_EDIT_PASTE);
lstBasicCommands.AddTail(ID_EDIT_UNDO);
lstBasicCommands. AdddTail(ID_APP_ABOUT);
lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR);
lstBasicCommands.AddTail(ID_VIEW_TOOLBAR);
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;
}


解决方案



因为工具栏的状态是注册表项,所以工具栏带有显式ID ,而不是依赖于上述代码中的默认参数。保存到的是基于ID,第二个工具栏正在保存它的第一个工具栏顶部的状态。



这里是代码更改解决问题:

  if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,CRect 1,1,1),IDR_MAINFRAME)|| 
!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons?IDR_MAINFRAME_256:IDR_MAINFRAME))
{
TRACE0(无法创建工具栏\\\
) ;
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(1,1,1,1 ),IDR_TOOLBAR)||
!m_wndToolBar2.LoadToolBar(IDR_TOOLBAR))
{
TRACE0(无法创建toolbar2 \\\
);
return -1; //无法创建
}


I'm having a problem with the CMFCToolbar class where the positions of the toolbars are not being restored properly between sessions.

Here is a screen shot of how the toolbars are arranged before the app is closed:

Here is a screen shot of how the toolbars are restored when the app is launched again:

Notice the large gap that appears above the first toolbar and the second toolbar is now to the right of the main toolbar instead of beneath it.

I was having problems with my app, so I generated this test app using the App Wizard, then I added the second toolbar manually.

I would like to know if this is because there is something I am doing wrong, or if it is just due to the buggy nature of the feature pack code.

Here is the code from my CMainFrame class which sets up the toolbars:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    BOOL bNameValid;

    // set the visual manager used to draw all user interface elements
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));

    // set the visual style to be used the by the visual manager
    CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);

    if (!m_wndMenuBar.Create(this))
    {
        TRACE0("Failed to create menubar\n");
        return -1;      // fail to create
    }

    m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);

    // prevent the menu bar from taking the focus on activation
    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("Failed to create toolbar\n");
        return -1;      // fail to create
    }

    CString strToolBarName;
    bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
    ASSERT(bNameValid);
    m_wndToolBar.SetWindowText(strToolBarName);

    m_wndToolBar.EnableTextLabels();

    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_TOOLBAR))
    {
        TRACE0("Failed to create toolbar2\n");
        return -1;      // fail to create
    }

    CString strCustomize("Toolbar2");
    m_wndToolBar2.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);

    // Allow user-defined toolbars operations:
    InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);

    if (!m_wndStatusBar.Create(this))
    {
        TRACE0("Failed to create status bar\n");
        return -1;      // fail to create
    }
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

    // TODO: Delete these five lines if you don't want the toolbar and menubar to be dockable
    m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockPane(&m_wndMenuBar);
    DockPane(&m_wndToolBar);
    DockPane(&m_wndToolBar2);


    // enable Visual Studio 2005 style docking window behavior
    CDockingManager::SetDockingMode(DT_SMART);
    // enable Visual Studio 2005 style docking window auto-hide behavior
    EnableAutoHidePanes(CBRS_ALIGN_ANY);

    // Load menu item image (not placed on any standard toolbars):
    CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0);

    // create docking windows
    if (!CreateDockingWindows())
    {
        TRACE0("Failed to create docking windows\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);


    // Enable toolbar and docking window menu replacement
    EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);

    // enable quick (Alt+drag) toolbar customization
    CMFCToolBar::EnableQuickCustomization();

    if (CMFCToolBar::GetUserImages() == NULL)
    {
        // load user-defined toolbar images
        if (m_UserImages.Load(_T(".\\UserImages.bmp")))
        {
            m_UserImages.SetImageSize(CSize(16, 16), FALSE);
            CMFCToolBar::SetUserImages(&m_UserImages);
        }
    }

    // enable menu personalization (most-recently used commands)
    // TODO: define your own basic commands, ensuring that each pulldown menu has at least one basic command.
    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_SORTING_SORTALPHABETIC);
    lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE);
    lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS);
    lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE);

    CMFCToolBar::SetBasicCommands(lstBasicCommands);

    return 0;
}

解决方案

This problem was resolved by creating the toolbars with explicit IDs as opposed to relying on the default parameter as in the above code.

Because the registry key that the toolbar's state is saved to is based on the ID, the second toolbar was saving its state on top of the first toolbar.

Here are the code changes that resolved the problem:

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1,1,1,1), IDR_MAINFRAME) ||
    !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
{
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
}

...

if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1,1,1,1), IDR_TOOLBAR) ||
    !m_wndToolBar2.LoadToolBar(IDR_TOOLBAR))
{
    TRACE0("Failed to create toolbar2\n");
    return -1;      // fail to create
}

这篇关于会话之间未正确恢复CMFCToolbar布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆