读书人

VS2010 菜单添加运行出现错误

发布时间: 2012-06-05 13:54:06 作者: rapoo

VS2010 菜单添加运行出现异常
今天学习MFC的时候,学习到通过代码动态添加菜单,经过测试,我下面的代码在VC6下能正常运行,但是在VS2010下,运行后,直接就提示异常了,我很不解,故特此来问下大虾们,这个是为什么会提示错误,我需要怎么修改错误

C/C++ code
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){    if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)        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);    // 启用工具栏和停靠窗口菜单替换    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);    CMFCToolBar::SetBasicCommands(lstBasicCommands);    CMenu menu;    menu.CreateMenu();    GetMenu()->AppendMenu(MF_POPUP, (UINT)menu.m_hMenu, _T("test") );    menu.Detach();        return 0;}

我的代码是直接在新建立MFC工程下操作的
谢谢了

[解决办法]
因为你选择的程序风格是比较新的MFC,里面的Menu等采用的微软购买的BCG组件(CMFC开头的)。
新的界面风格里,菜单已经被CMFCMenuBar接管,这个和传统的CMenu是不兼容的。要想用原来的方法,你应该创建应用程序时,“应用程序类型”里选择“项目类型”是“MFC标准”。然后在“用户界面功能”里“命令栏(菜单/工具栏/功能区)”里选择使用“使用经典菜单”(可以再选上“使用浏览器样式的工具栏”,那样比较美观)。



[解决办法]
两个编译器及字符,函数等都有所不同,需要一点点的分析差异
[解决办法]
VS2010在创建项目时的菜单是BCG原理,和VC6的经典菜单不一样,结构都不一样


解决方法:
1. 修改成BCG的函数添加菜单
2. 在创建项目时菜单选择经典菜单就可以啦
[解决办法]
是编译器的不同所致,你如果要其成功,你可以如图设置你的VS2010

1、我的是英文的,你可以对着设置,选单文档应用程序


2、第二步再如图即可:

读书人网 >VC/MFC

热点推荐