
- •Лабораторный практикум «Основы разработки приложений Windows» Книга 1
- •Часть 1. Теоретические сведения4
- •Часть 2. Лабораторный практикум95
- •Часть 1 Теоретические сведения
- •1. Структура приложения Windows Простейшая программа с главным окном
- •Структура программы
- •Главная функция WinMain()
- •Регистрация класса окна
- •Создание и показ окна
- •Сообщения Windows и цикл их обработки
- •Оконная функция
- •Макрос handle_msg и структурирование программы
- •2. Интерфейс графических устройств
- •Простая программа, использующая средства gdi
- •Обработка сообщений wmpaint
- •Контекст устройства
- •Использование графических инструментов
- •3. Ресурсы: меню Простая программа с меню
- •Файл ресурсов
- •Описание меню в файле ресурсов
- •Сообщение wmcommand
- •Программное создание меню
- •Плавающее меню
- •Инструментальная панель
- •Всплывающие подсказки
- •0,"Первая строка"
- •1,"Вторая строка"
- •2,"Третья строка"
- •4. Ресурсы: диалоговые окна
- •Простая программа с меню и диалогом
- •Описание диалога в файле ресурсов
- •Обслуживание модального диалога
- •Модальный диалог как главное окно приложения
- •Немодальный диалог
- •Список в диалоговом окне
- •Окно редактирования и статический элемент управления
- •Графика в диалоговом окне
- •Перекрашивание диалогового окна и его элементов
- •Часть 2 Лабораторный практикум Работы лабораторного практикума Работа 1. Вызов функций Windows
- •Работа 2. Главное окно приложения (пример 1-1 из настоящего пособия)
- •Работа 3. Вывод в главное окно приложения текста и фигур (пример 2-1 из настоящего пособия)
- •Работа 4.Вывод в главное окно приложения текста и фигур (индивидуальное задание а)
- •Работа 5. Меню и модальный диалог (пример 4-1 из настоящего пособия)
- •Работа 6.Меню (индивидуальное задание в)
- •Работа 7.Модальный диалог в качестве главного окна приложения (индивидуальное задание с)
- •Работа 8.Вывод графика в главное окно приложения (индивидуальное заданиеD)
- •Работа 9. Немодальный диалог
- •Работа 10. Диалог с окном редактирования
- •Работа 11. Программное создание меню
- •Работа 12. Плавающее меню
- •Работа 13. График в диалоговом окне
- •Работа 14. Инструментальная панель (tool bar)
- •Работа 15. Инструментальная панель со всплывающими подсказками (tool tips)
- •Работа 16. Пользовательские пиктограммы и курсоры
- •Работа 17. Локализация программных продуктов
- •Индивидуальные задания лабораторного практикума
Программное создание меню
Как уже отмечалось, меню чаще всего описывается в файле ресурсов, так как в этом случае облегчается задача изменения его состава или поясняющих надписей. Однако в некоторых случаях может оказаться более удобным создать меню программно, без помощи файла ресурсов. Программное создание меню включает в себя следующие действия:
создание линейки меню приложения (пока пустой) функцией CreateMenu() с получением дескриптора этого меню;
создание всплывающего меню для помещения в него требуемого набора пунктов (но пока тоже пустого и даже без названия) функцией CreatePopupMenu() с получением дескриптора всплывающего меню;
заполнение всплывающего меню конкретными пунктами функцией AppendMenu().В качестве второго параметра этой функции указывается константаMFSTRING (илиMFSEPARATOR для разделительной линии), в качестве третьего – символическое обозначение идентификатора данного пункта меню, которое должно быть определено в файле.H, а в качестве последнего, четвертого параметра – адрес строки текста, представляющей собой название данного пункта меню (для разделительной линии этому параметру дается значениеNULL);
включение всплывающего меню в линейку меню и задание его имени той же функцией AppendMenu(), в качестве второго параметра которой следует указать константуMFPOPUP,в качестве третьего – дескриптор всплывающего меню, преобразованный в типUINT, а в качестве четвертого – адрес строки с названием всего всплывающего меню;
присоединение всего меню к главному окну приложения функцией SetMenu().
Все эти действия удобнее всего выполнить в функции OnCreate();там же можно объявить символьные строки с названиями пунктов меню. На рис. 3.4 показано меню из программы 3-1 с комментариями, поясняющими использованную в этом разделе терминологию.
Рис. 3.4. Меню, созданное программно
Плавающее меню
В приложениях Windows широко используются плавающие меню (не путать с всплывающим меню, являющимся элементом обычного меню), активизируемые обычно щелчком правой клавиши мыши. Плавающее меню (рис. 3.5) появляется в том месте экрана, где в данный момент находится курсор мыши.
Рис. 3.5. Плавающее меню
Поскольку плавающее меню должно активизироваться нажатием правой клавиши мыши, в оконную функцию следует включить обработку сообщения WMRBUTTONDOWN, ивсе действия по созданию меню выполнить в функции обработки этого сообщения (назвав ее, например,OnRButtonDown()).Установка плавающего меню почти не отличается от программного создания обычного статического меню и включает в себя следующие действия:
создание всплывающего меню для помещения в него требуемого набора пунктов (пока пустого) функцией CreatePopupMenu() с получением дескриптора всплывающего меню (линейка меню в этом случае не создается);
заполнение всплывающего меню конкретными пунктами функцией AppendMenu() в точности так же, как и при создании обычного меню. Поскольку линейки меню в этом случае нет, всплывающее меню ни к чему не подсоединяется;
объявление созданного всплывающего меню плавающимфункциейTrackPopupMenu(). Второй параметр этой функции задается равным 0. В качестве следующих двух параметров следует указать текущие координаты курсора мыши. Всправке по функцииTrackPopupMenu() указано, что эта функция рассматривает передаваемые ей координаты как экранные, в то время как при вызове функцииOnRButtonDown() в нее передаются координаты относительно левого верхнего угла рабочей области окна; для коррекции координат можно воспользоваться функциейGetWindowRect(), которая возвращает текущие координаты левого верхнего угла окна приложения относительно начала экрана. Однако и в этом случае плавающее окно будет несколько смещено относительно положения указателя мыши, поскольку рабочая область окна не совпадает со всем пространством окна из-за наличия толстой рамки и строки заголовка. Для точного позиционирования плавающего меню относительно курсора мыши придется учесть размеры и этих элементов. Лучше всего получить координаты курсора мыши не из параметров функцииOnRButtonDown(), а непосредственно из пакета сообщения (структурной переменнойmsg), куда системой передаютсяэкранныекоординаты.