Как добавить меню документа в приложение MFC? - PullRequest
0 голосов
/ 07 июня 2018

при щелчке правой кнопкой мыши на любой вкладке в Visual Studio появится меню, содержащее некоторые параметры, такие как (Сохранить, Закрыть все кроме этого, Копировать полный путь, Открыть, содержащую папку, ....).Как добавить подобное меню в приложении с вкладками MFC (doc / view)?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Я обработал сообщение WM_RBUTTONUP в функции PreTranslateMessage следующим образом:

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
  if( WM_RBUTTONUP == pMsg->message)
  {
    //check that the right click is on MDI tab area.
    CWnd* pWnd = FromHandle(pMsg->hwnd);
    CMFCTabCtrl* tabGroup = dynamic_cast<CMFCTabCtrl*>(pWnd);
    if (tabGroup)
    {
      CPoint clickLocation = pMsg->pt;
      tabGroup->ScreenToClient(&clickLocation);
      int tabIndex = tabGroup->GetTabFromPoint(clickLocation);
      if (tabIndex != -1)
      {
        CWnd* pTab = tabGroup->GetTabWnd(tabIndex);
        if (pTab)
        {
          CPoint point = pMsg->pt;
          ClientToScreen (&point);
          ShowPopupTabOptions(point);
        }
      }
    }
  }

  return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}
0 голосов
/ 08 июня 2018

У вас должно быть более одного меню.IDR_MAINFRAME обычно используется, когда документы не открыты, это не тот файл, который вам нужен.

В редакторе ресурсов должно отображаться другое главное меню (не всплывающее меню), идентификатор которого похож на IDR_MyAppTYPE.Этот идентификатор меню уже должен быть в вашем CWinAppEx классе:

BOOL CMyApp::InitInstance()
{
    ...
    pDocTemplate = new CMultiDocTemplate(IDR_MyAppTYPE, ...);
    ...
}

Это меню вашего документа.

Отредактируйте это меню с помощью редактора ресурсов.Добавьте команду "Close all but this", и идентификатор команды меню будет выглядеть примерно так: ID_WINDOW_CLOSEALL_BUT_THIS

Вы должны обработать эту команду в CView производном классе.Пример:

BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_COMMAND(ID_WINDOW_CLOSEALL_BUT_THIS, OnCloseAllButThis)
    ...
END_MESSAGE_MAP()

void CMyView::OnCloseAllButThis()
{
    POSITION p1 = AfxGetApp()->GetFirstDocTemplatePosition();
    while(p1)
    {
        CDocTemplate *doctempl = AfxGetApp()->GetNextDocTemplate(p1);
        POSITION p2 = doctempl->GetFirstDocPosition();
        while(p2)
        {
            CDocument* doc = doctempl->GetNextDoc(p2);
            POSITION p3 = doc->GetFirstViewPosition();
            while(p3)
            {
                CView* view = doc->GetNextView(p3);
                if(view && view->GetParentFrame() && view != this)
                    view->GetParentFrame()->SendMessage(WM_CLOSE);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...