- •Лабораторный практикум «Основы разработки приложений 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. Локализация программных продуктов
- •Индивидуальные задания лабораторного практикума
Всплывающие подсказки
В современных программах, управляемых с помощью меню и инструментальных панелей, принято включать в состав меню всплывающие подсказки – небольшие окошки, открываемые автоматически, когда курсор мыши помещается на соответствующую кнопку инструментальной панели (рис. 3.8).
Рис. 3.8. Всплывающая подсказка в редакторе Microsoft Word
Для организации всплывающих подсказок следует прежде всего создать инструментальную панель, как это было описано в предыдущем подразделе, дополнив ее стиль, указываемый в качестве второго параметра функции CreateToolbarEx(), константойTBSTYLETOOLTIPS. Отслеживание положения курсора мыши и вывод на экран требуемых подсказок осуществляется в ответ на сообщение WindowsWMNOTIFY, для обработки которого оконную функцию следует дополнить соответствующим макросомHANDLEMSG. ФункцияOnNotify(), вызываемая в случае прихода в приложение сообщенияWMNOTIFY, имеет следующий прототип:
LRESULT OnNotify (HWND hwnd, int wParam, LPNMHDR lParam);
Последний параметр этой функции lParamимеет тип указателя на структуруNMHDR. Фактически, однако, этот параметр указывает на бóльшую по объему структуру типаTOOLTIPTEXT, в которую структураNMHDR входит в качестве первого элемента (рис. 3.9).
Таким образом, если использовать параметр lParam непосредственно, он будет служить указателем на структуруNMHDR, и с его помощью можно обращаться к элементам этой структуры, однако остальные элементы структурыTOOLTIPTEXT будут недоступны. Если же преобразовать параметрlParamв типLPTOOLTIPTEXT, то он будет указывать на всю структуруTOOLTIPTEXT, и через него можно получить доступ ко всем элементам этой структуры; через имя вложенной структурыhdr в этом случае можно получить доступ и к элементам структурыNMHDR.
Рис. 3.9. Взаимоотношение структур TOOLTIPTEXT и NMHDR
Таким образом, допустимы, в частности, следующие обращения:
lParam->code (lParam – указатель на структуруNMHDR, аcode – элемент этой структуры);
lParam->idFrom (та же ситуация);
((LPTOOLTIPTEXT) lParam)->szText(выражение(LPTOOLTIPTEXT) lParamявляется указателем на структуруTOOLTIPTEXT, а szText – элемент этой структуры);
((LPTOOLTIPTEXT) lParam)->hdr.idFrom(обращение к элементам вложенной структуры посредством указателя на внешнюю).
Функция OnNotify() будет вызываться в ответ на все сообщенияWMNOTIFY, однако нас будут интересовать лишь те сообщения, для которых кодcode, входящий в структуруNMHDR,равенTTNNEEDTEXT.Эти сообщения посылаются в приложение, когда курсор мыши устанавливается над какой-либо кнопкой инструментальной панели, и, соответственно, панель нуждается в получении текста подсказки. Поэтому в функцииOnNotify() следует прежде всего отобрать (с помощью оператораif) эти сообщения. Вывод подсказок осуществляется путемкопированиятекста подсказки в элементszText структурыTOOLTIPTEXT. Поскольку для разных кнопок подсказки разные, предложения копирования (посредством функции С++strcpy()) удобно включить в конструкциюswitch-case;операторswitch в этом случае должен анализировать значение элементаidFrom структурыNMHDR, в который поступает идентификатор кнопки, находящейся под курсором мыши.
Таблицы строк и локализация программных продуктов
Выше уже отмечалось, что в качестве ресурсов могут фигурировать самые разные объекты Windows: описания меню и диалогов, растровые изображения, пиктограммы и курсоры и пр. В частности, в виде ресурсов могут быть описаны текстовые строки. Размещение таблиц строк в файле ресурсов позволяет выполнять их редактирование непосредственно в загрузочном файле. Это дает возможность локализовать программные продукты, т. е. переводить используемые в них поясняющие надписи на национальный язык при отсутствии исходного текста программы.
Ресурс - таблица строк описывается следующим образом:
STRINGTABLE {