Visual C++. Лабораторная работа № 7.
Создание меню в Windows Application (на базе однодокументного приложения). Подключение команд меню к коду программы.
- Цель работы:
- Изучить порядок создания приложения типа Single Document. Научиться создавать
свои пункты меню, подключать к ним программный код. Получить практические навыки
в написании программ с развитым меню.
1. Создайте приложение с помощью MFС AppWizard (exe), выбрать тип предложения
Single document
2. Перейти на вкладку Res.., найти ресурс IDR_MAINFRAME -меню и перейти в
редактор меню. С помощью средств визуального редактора меню создать новый пункт
меню и к нему несколько подпунктов
3. Добавить к каждому пункту созданного Вами меню программный код который
позволяет выводить в окне документа надписи соответствующее выбранному пункту
меню (например: ВЫБРАН 1 пункт меню или ВЫБРАН 2 пункт меню и т.д.)
4. Добавить возможность программной блокировки и разблокировки отдельных
пунктов меню, а также возможности изменения надписей в пункте меню, установки
галочек и точек напротив надписей (использовать полученную на лекции информацию)
5. Добавить кнопки на панель инструментов и привязать к ним команды меню, использовать ресурс
Toolbar. Сделать клавиши акселераторы, используя ресурс Accelerator
6. Добавляем пункт в меню который позволяет нам ввести данные о автомобилях из
файла созданного в лабораторной работе № 5. Выводим полученные данные в окно
программы (использовать материал лекции и предыдущих лабораторных работ)
Пункты и подпункты меню добавляются элементарно, поэтому останавливаться на этом
не будем. Для начала инициализируем переменные int y и char punkts[50][16].
Массив punkts будет хранить выбранные названия пунктов. Для этого щелкаем правой
кнопкой мыши на классе CLab_07Doc на вкладке CLassView и выбираем пункт
Add Member Variable, где указываем тип и имя переменной. Затем в классе
CLab_07Doc дважды щелкаем по функции OnNewDocument(), где пишем
y = 0;
strcpy(punkts[y], "Мучения с меню");
Затем выбираем класс CLab_07View и дважды щелкаем по функции OnDrow().
В теле функции пишем:
void CLab_07View::OnDraw(CDC* pDC) {
CLab_07Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
for (int i = 0; i <= pDoc->y; i++)
pDC->TextOut(0, i*20, pDoc->punkts[i]);
}
Как добавить код к пункту? Выбираем View -> ClassWizard -> Message Maps.
В списке Object IDs выбираем идентификатор нужного пункта (для первого пункта
в нашем случае это ID_MENUITEM32771). В поле Class name должен быть выбран
класс CLab_07View. В списке Messages выбираем COMMAND и щелкаем кнопку Add
Functions… Затем пишем имя функции (для первого пункта пусть будет OnFirstPunkt),
щелкаем ОК и Edit Code. Пишем такой код:
CLab_07Doc* pDoc = GetDocument();
strcpy(pDoc->punkts[++pDoc->y], "Первый пункт");
Invalidate(); //Перерисовать окно
То же самое проделываем с остальными пунктами.
Затем добавляем переменные в класс CLab_07View. Методика описана выше. А
переменные будут такие:
bool block;
bool ch;
Cstring str;
Затем дважды щелкаем по функции CLab_07View() и инициализируем переменные:
block = 1;
str = "Новое название";
Затем для пункта ЗАБЛОКИРОВАТЬ добавляем функцию UPDATE_COMMAND_UI и в ее теле пишем
pCmdUI->Enable(block);
Для пункта ЗАБЛОКИРОВАТЬ добавляем функцию COMMAND и в ее теле пишем
block = 0;
Что же будет происходить? По щелчку на пункте ЗАБЛОКИРОВАТЬ переменной block
будет присвоено значение 0, функция UPDATE_COMMAND_UI получит это значение и
выполнит код
pCmdUI->Enable(block);
который и заблокирует соответствующий пункт меню (ЗАБЛОКИРОВАТЬ).
Аналогично поступаем с другими подпунктами. При этом в функциях UPDATE_COMMAND_UI
используем следующие коды:
pCmdUI->SetText(str); //Установить текст надписи
pCmdUI->SetCheck(ch); //Установить\удалить галочку
pCmdUI->SetRadio(ch); //Установить\удалить точку
В обработчиках соответствующих событий можно написать:
ch = !ch;
Тогда по каждому щелчку переменной ch будет присваиваться противоположное значение.
Дальше к пунктам меню делаем кнопки на панели. Находим в ресурсах TolBar. В нем
рисуем кнопки и размешаем их на панели. Щелкаем по нужной кнопке, в свойствах
кнопки выбираем ID идентификатор пункта меню, к которому хотим приделать кнопку. И все.
Для добавления акселераторов надо в ресурсах в папке Accelerator дважды щелкаем по IDR_MAINFRAME.
На открывшемся списке щелкаем правой кнопкой и выбираем New Accelerator. Выбираем
ID и сочетание клавиш. Вот что получилось:
Позволю себе не останавливаться подробно на пятом пункте, т.к. открывать файлы,
создавать структуры, массивы и переменные мы умеем. Перерисовка окна и вывод
текста на экран в этой лабораторной также уже рассматривалась.