virtual void AssertValid const;

 virtual void Dump(CDumpContext& dc) const;

#endif

protected:

 //{{AFX_MSG(CMultiView)

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP

};

Остальные классы приложения остаются без изменения.

Таблица сообщений класса CMultiView

При добавлении контекстного меню к окну класса 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

Метод OnContextMenu класса CMultiView

Когда пользователь нажимает правую кнопку мыши в окне, макрокоманда 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 представляет собой комбинацию атрибутов. Они определяют, как будет отображаться меню и какая кнопка мыши используется для выбора строк из этого меню.

Перейти на страницу:

Похожие книги