когда вы щелкните правой кнопкой мыши любую вкладку в Visual Studio, появится меню, содержащее некоторые параметры, такие как (Сохранить, Закрыть все, кроме этого, Копировать полный путь, Открыть содержащую папку, ....). Как добавить подобное меню в приложение с вкладками MFC (doc / view)? Заранее спасибо.
Вкладки не относятся к меню. Что касается меню, ваше приложение почти всегда содержит главное меню (обычно IDR_MAINFRAME), а если вы используете функцию doc / view, еще одно для каждого типа документа (фактически, шаблон документа). Второй связан с типом документа и отображается, когда документ активен. Выберите, в какое меню вы хотите добавить дополнительные пункты меню. Команды могут обрабатываться (в зависимости от ваших данных и дизайна) классом документа, представления или мэйнфрейма.
да, я использую функцию doc / view. Я имею в виду, что иногда у меня есть много открытых шаблонов документов, и я могу переключаться между ними, используя вкладки в верхней части основного фрейма. а иногда я хочу закрыть все открытые документы, кроме одного. такой же, как опция, поддерживаемая в Visual Studio, например, когда у вас есть несколько открытых файлов CPP, и вы нажимаете на верхнюю вкладку и выбираете «Закрыть все, кроме этого» @ConstantineGeorgiou
Я использую функцию документа / просмотра. Я имею в виду, что иногда у меня есть много открытых шаблонов документов, и я могу переключаться между ними, используя вкладки в верхней части основного фрейма. а иногда я хочу закрыть все открытые документы, кроме одного. такой же, как опция, поддерживаемая в Visual Studio, например, когда у вас есть несколько открытых файлов CPP, и вы нажимаете на верхнюю вкладку и выбираете «Закрыть все, кроме этого» @BarmakShemirani
И все же при чем здесь меню (ваш вопрос касался меню)? Итак, как сказано выше, добавьте пункт меню в меню, специфичное для шаблона документа, и обработчик (ON_COMMAND). В обработчике (поместите его в класс документа) получите шаблон документа и заполните список всех его документов (GetFirstDocPosition() / GetNextDoc()). Закройте все открытые документы, НЕ равные текущему (this).





У вас должно быть более одного меню. 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);
}