最近有个项目 要将 一个 单文档的程序插入到一个 对话框程序中,想到将单文档程序做成ActiveX组件,然后在对话框程序中调用。做成的组件其他的都能显示 ,就是  菜单栏不能显示纠结啊有没有哪位大神知道怎么处理吗? 

解决方案 »

  1.   


    我在网上查了好多和我类似的问题,但是都没有给出可用的解决方法。
    我是在框架文件的onCreate()函数中用
    CMenu *pMenu=GetMenu();
    pMenu->CheckMenuItem(IDM_TOOLBAR, MF_CHECKED);
    pMenu->CheckMenuItem(IDM_VIEWBAR, MF_CHECKED);
    pMenu->CheckMenuItem(IDM_STATUSBAR, MF_CHECKED);
    使用菜单,调试的时候GetMenu()函数的返回值是0,getlasterror()提示说是子窗口没有菜单。但是如果只运行单文档的程序是没有问题的,做成ActiveX控件就出现上面的错误。
      

  2.   

    以下是一段在ActriveX中的单文档程序代码:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    { if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;       if (!m_wndMenuBar.CreateEx(this, TBSTYLE_FLAT ))
          {
             TRACE0("Failed to create Menubar ");
             return -1; // fail to create
    }        m_wndMenuBar.SetSizes(CSize(30,20),CSize(1,1)); TBBUTTON button;
            CString strItem;
    CMenu mTopMenu;
    mTopMenu.LoadMenu(IDR_MAINFRAME);      UINT iPos;
    for (iPos = 0; iPos<mTopMenu.GetMenuItemCount(); iPos++)
           {    mTopMenu.GetMenuString(iPos, strItem, MF_BYPOSITION);
       button.idCommand = iPos+1;
       button.iBitmap = -1;
               button.fsState = 0;
               button.fsStyle = TBSTYLE_BUTTON;
               button.iString = -1;
       m_wndMenuBar.GetToolBarCtrl().InsertButton(iPos,&button);
       m_wndMenuBar.SetButtonText(iPos,strItem);
    } ////隐藏某个菜单项。
    m_wndMenuBar.GetToolBarCtrl().HideButton(3); if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT ) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0("未能创建工具栏\n");
    return -1;      // 未能创建
    }
    m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() & ~CBRS_HIDE_INPLACE);
    if (!m_wndReBar.Create(this) || !m_wndReBar.AddBar(&m_wndToolBar)  )
    {
    TRACE0("未能创建 Rebar\n");
    return -1;      // 未能创建
    }
    m_wndReBar.SetBarStyle(m_wndReBar.GetBarStyle() & ~CBRS_HIDE_INPLACE); //// TODO: 如果不需要工具提示,则将此移除
    m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()  | CBRS_TOOLTIPS | CBRS_FLYBY); if (!m_wndStatusBar.Create(this))
    {
    TRACE0("未能创建状态栏\n");
    return -1;      // 未能创建
    }
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

    return 0;
    }void CMainFrame::OnMenu(UINT nID)
    {   CMenu m_mnuTopMenu;
       CRect rWindow,rButton;   m_mnuTopMenu.LoadMenu(IDR_MAINFRAME);
       UINT iPos;  for (iPos = 0; iPos<m_mnuTopMenu.GetMenuItemCount(); iPos++)
        {
         if (iPos == nID-1)
         {
           m_wndMenuBar.GetWindowRect(&rWindow);
           m_wndMenuBar.GetItemRect( iPos, &rButton);
           rWindow.top += rButton.bottom;
           rWindow.left += rButton.left;
           m_wndMenuBar.GetToolBarCtrl().SetState(iPos+1,TBSTATE_PRESSED|TBSTATE_ENABLED);  // show popup menu
          m_mnuTopMenu.GetSubMenu(iPos)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,rWindow.left,rWindow.top,this);
          m_wndMenuBar.GetToolBarCtrl().SetState(iPos+1,TBSTATE_ENABLED);
          break;
         }
       }

      

  3.   

    这个在AcriveX中显示的单文档程序,具有菜单栏、工具栏和状态栏。一切正常使用。