virtual void AssertValid const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
//{{AFX_MSG(CMultiView)
//}}AFX_MSG
DECLARE_MESSAGE_MAP
};
Остальные классы приложения остаются без изменения.
При добавлении контекстного меню к окну класса CMultiView, в таблицу сообщений класса CMultiView добавляется новая макрокоманда ON_WM_CONTEXTMENU:
//////////////////////////////////////////////////////////////
// Таблица сообщений класса CMultiView
// Объекты класса CMultiView создаются динамически
IMPLEMENT_DYNCREATE(CMultiView, CView)
// Таблица сообщений класса CMultiView. В нее добавлена
// макрокоманда ON_WM_CONTEXTMENU
BEGIN_MESSAGE_MAP(CMultiView, CView)
ON_WM_CONTEXTMENU
//{{AFX_MSG_MAP(CMultiView)
//}}AFX_MSG_MAP
// Стандартные команды
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)
END_MESSAGE_MAP
Когда пользователь нажимает правую кнопку мыши в окне, макрокоманда ON_WM_CONTEXTMENU вызывает метод-обработчик OnContextMenu из класса этого окна. Методу OnContextMenu передаются два параметра:
afx_msg void OnContextMenu(CWnd* pWnd, CPoint pos);
Параметр pWnd содержит указатель на объект класса CWnd. Он представляет окно, в котором находился указатель мыши, когда была нажата правая кнопка мыши. Это может быть окно класса к которому принадлежит таблица сообщений или его дочернее окно.
Параметр pos, представляющий объект класса CPoint, содержит координаты указателя мыши, зафиксированные в момент нажатия правой кнопки мыши.
Реализация метода OnContextMenu добавляется в файле MultiView.cpp:
//////////////////////////////////////////////////////////////
// Метод OnContextMenu класса CMultiView
// CG: Метод OnContextMenu добавлен компонентом Pop-up Menu
void CMultiView::OnContextMenu(CWnd*, CPoint point) {
// Объект menu будет представлять контекстное меню
CMenu menu;
// Загружаем меню CG_IDR_POPUP_MULTI_VIEW
VERIFY(menu.LoadMenu(CG_IDR_POPUP_MULTI_VIEW));
// Получаем указатель на всплывающее меню
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
// Получаем указатель на объект CWnd, представляющий окно
// для которого надо отобразить контекстное меню
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle & WS_CHILD) pWndPopupOwner = pWndPopupOwner->GetParent;
// Отображаем контекстное меню
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner);
}
Для вывода контекстного меню на экран используется метод TrackPopupMenu, входящий в класс CMenu. Контекстное меню можно открыть в любом месте экрана. Вне зависимости от расположения меню, все командные сообщения от него передаются одному определенному окну.
Параметры метода TrackPopupMenu задают расположение контекстного меню и выбирают для него окно, в которое будут передаваться командные сообщения:
BOOL TrackPopupMenu(UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = 0);
Параметр nFlags представляет собой комбинацию атрибутов. Они определяют, как будет отображаться меню и какая кнопка мыши используется для выбора строк из этого меню.