Как добавить меню документа в приложение MFC?

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

"Приложение с вкладками MFC" может относиться ко многим вещам. Пожалуйста, объясните поподробнее.
Barmak Shemirani 07.06.2018 16:31

Вкладки не относятся к меню. Что касается меню, ваше приложение почти всегда содержит главное меню (обычно IDR_MAINFRAME), а если вы используете функцию doc / view, еще одно для каждого типа документа (фактически, шаблон документа). Второй связан с типом документа и отображается, когда документ активен. Выберите, в какое меню вы хотите добавить дополнительные пункты меню. Команды могут обрабатываться (в зависимости от ваших данных и дизайна) классом документа, представления или мэйнфрейма.

Constantine Georgiou 07.06.2018 17:20

да, я использую функцию doc / view. Я имею в виду, что иногда у меня есть много открытых шаблонов документов, и я могу переключаться между ними, используя вкладки в верхней части основного фрейма. а иногда я хочу закрыть все открытые документы, кроме одного. такой же, как опция, поддерживаемая в Visual Studio, например, когда у вас есть несколько открытых файлов CPP, и вы нажимаете на верхнюю вкладку и выбираете «Закрыть все, кроме этого» @ConstantineGeorgiou

Elamir Ohana 07.06.2018 17:39

Я использую функцию документа / просмотра. Я имею в виду, что иногда у меня есть много открытых шаблонов документов, и я могу переключаться между ними, используя вкладки в верхней части основного фрейма. а иногда я хочу закрыть все открытые документы, кроме одного. такой же, как опция, поддерживаемая в Visual Studio, например, когда у вас есть несколько открытых файлов CPP, и вы нажимаете на верхнюю вкладку и выбираете «Закрыть все, кроме этого» @BarmakShemirani

Elamir Ohana 07.06.2018 17:46

И все же при чем здесь меню (ваш вопрос касался меню)? Итак, как сказано выше, добавьте пункт меню в меню, специфичное для шаблона документа, и обработчик (ON_COMMAND). В обработчике (поместите его в класс документа) получите шаблон документа и заполните список всех его документов (GetFirstDocPosition() / GetNextDoc()). Закройте все открытые документы, НЕ равные текущему (this).

Constantine Georgiou 07.06.2018 20:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
370
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У вас должно быть более одного меню. 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);
            }
        }
    }
}
Ответ принят как подходящий

Я обработал сообщение 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);
}

Другие вопросы по теме