- •Овсянник в.Н. Лабораторные работы по курсу «Объектно-ориентированное программирование»
- •13. Разработка приложения с архитектурой «документ-вид». Часть 2 120
- •14. Разработка приложения с архитектурой «документ-вид». Часть 3 135
- •1.Разработка типового консольного приложения
- •1.1.Методические указания
- •1. Запуск и настройка ис mvs-2008.
- •2.Поиск данных в массиве
- •3.Обработка текстового файла
- •4.Задача «куча камней»
- •5.Реализация алгоритма полного перебора
- •6. Исследование погрешностей вычислений
- •7.Поиск экстремумов с ограничениями или «Брачное агенство»
- •Постановка задачи
- •Задание
- •Листинг файла mAgency.Cpp (с главной функцией)
- •Листинг файла Lib.H
- •Листинг файла Lib.Cpp
- •8.Приложение с окном вида
- •9.Разработка графического редактора
- •Задание.
- •9.1.Проектирование программы
- •9.2.Разработка интерфейса
- •Установка флагов
- •Создание меню и панели инструментов
- •Обработка сообщений о нажатии кнопки мыши
- •9.3.Рисование
- •9.4.Растягивание фигур
- •9.5.Обновление изображения
- •9.6.Сохранение метафайла на диске и его загрузка
- •10.Приложение, основанное на модальном диалоговом окне
- •Методические указания Модальные и немодальные диалоговые окна
- •Ресурсы и элементы управления
- •Сценарий создания приложения
- •Разбор приложения
- •Усовершенствование приложения
- •11.Приложение с контекстным меню и строкой состояния
- •11.1.Методические указания к первой части работы
- •11.2.Сценарий выполнения первой части работы
- •11.3.Методические указания ко второй части работы Строка состояния
- •Определение секций в строке состояния
- •Строка сообщений
- •Индикатор состояния
- •Управление строкой состояния
- •11.4.Сценарий выполнения второй части работы
- •12.Разработка приложения с архитектурой «документ-вид». Часть 1
- •12.1.Сценарий создания приложения
- •13.Разработка приложения с архитектурой «документ-вид». Часть 2
- •13.1.Методические указания Класс коллекций cObList
- •13.2.Сценарий выполнения работы
- •14.Разработка приложения с архитектурой «документ-вид». Часть 3
- •14.1.Методические указания
- •15.Класс вектор
- •15.1.Пример класса tVector
- •15.2.Класс tVector с перегруженными операциями
- •16.Приложение с таблицей
- •16.1.Вариант 1 Сценарий выполнения работы
- •16.2.Вариант 2 Сценарий выполнения работы
11.Приложение с контекстным меню и строкой состояния
Нельзя научиться программированию с помощью ручного калькулятора, но можно забыть арифметику
Цель работы – освоить разработку приложения, выполняющего просмотр изображений и включающего контекстное меню и строку состояния (4 час.).
Задание.
Ознакомьтесь с методическими указаниями и выполните работу в соответствии с приведенным ниже сценарием. В первой части работы Вам необходимо создать приложение, включающее контекстное меню, а во второй – добавить к этому приложению строку состояния, в которой будут отображаться координаты курсора мыши.
11.1.Методические указания к первой части работы
Обычно каркас приложений и редактор меню отделяет программиста от класса CMenu. Объект этого класса может представлять любое меню Windows, в том числе меню верхнего уровня и связанные с ним раскрывающиеся меню. Чаще всего, когда вызывается функция Create() для окна-рамки и объект CMenu явным образом не создается, ресурс меню подсоединяется прямо к этому окну. Функция-член GetMenu() класса CWnd возвращает временный указатель на CMenu. Получив этот указатель, Вы получаете свободный доступ к меню и можете изменять его.
Допустим, Вы хотите переключать меню после запуска приложения. Исходное меню всегда имеет идентификатор IDR_MAINFRAME. Если Вам нужно второе меню, Вы создаете его в редакторе меню и определяете требуемый идентификатор. Затем в своей программе Вы создаете объект CMenu, загружаете меню из ресурса с помощью CMenu::LoadMenu() и вызываете CWnd::SetMenu(), чтобы присоединить новое меню к окну-рамке. После этого вызываете метод Detach(), чтобы отсоединить от объекта описатель HMENU; тогда созданное Вами меню не будет уничтожено, когда объект CMenu выйдет из области видимости.
Можно определить меню в ресурсе и потом модифицировать его в период выполнения программы. При необходимости в период выполнения можно создать и все меню целиком, не пользуясь ресурсами. В любом случае для этого пригодятся такие функции-члены класса CMenu, как ModifyMenu(), InsertMenu() и DeleteMenu(). Каждая из них работает с отдельным элементом меню, определяемому по идентификатору или по индексу его позиции в меню.
Объект меню в действительности состоит из вложенной структуры подменю. Функция-член GetSubMenu() возвращает указатель на объект CMenu, представляющий собой раскрывающееся меню в главном объекте CMenu. Функция CMenu::GetMenuString() возвращает текст в элементе меню, указанному индексом или идентификатором команды. В последнем случае выполняется поиск по всей системе меню, включая вложенные.
Контекстные меню (floating pop-up menu) — одна из последних новаций в пользовательском интерфейсе. Щелчок ПКМ открывает меню с командами, которые относятся к текущему контексту. Такие меню легко создать с помощью графического редактора и MFC-функции CMenu::TrackPopupMenu(). Для этого надо выполнить следующие действия:
Откройте редактор меню и добавьте в файл ресурсов своего проекта новое пустое меню.
Введите какое-нибудь имя для крайнего слева элемента меню верхнего уровня (эта команда не будет видна даже зрячему пользователю) и добавьте команды контекстного меню в получившееся распускающееся меню.
Вставьте обработчик сообщения WM_CONTEXTMENU в класс «вид» или в класс другого окна, получающего сообщения от кнопок мыши, и запрограммируйте его следующим образом:
void CCNTXMenuView::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu;
menu.LoadMenuW(IDR_CNTXMENU);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this);
}
Команды контекстного меню можно сопоставить с обработчиками тем же способом, что и команды «обычного» меню окна-рамки.
