Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 1.DOC
Скачиваний:
118
Добавлен:
10.05.2014
Размер:
721.41 Кб
Скачать

Программное создание меню

Как уже отмечалось, меню чаще всего описывается в файле ресурсов, так как в этом случае облегчается задача изменения его состава или поясняющих надписей. Однако в некоторых случаях может оказаться более удобным создать меню программно, без помощи файла ресурсов. Программное создание меню включает в себя следующие действия:

  • создание линейки меню приложения (пока пустой) функцией CreateMenu() с получением дескриптора этого меню;

  • создание всплывающего меню для помещения в него требуемого набора пунктов (но пока тоже пустого и даже без названия) функцией CreatePopupMenu() с получением дескриптора всплывающего меню;

  • заполнение всплывающего меню конкретными пунктами функцией AppendMenu().В качестве второго параметра этой функции указывается константаMFSTRING (илиMF­SE­PARATOR для разделительной линии), в качестве третьего – символическое обозначение идентификатора данного пункта меню, которое должно быть определено в файле.H, а в качестве последнего, четвертого параметра – адрес строки текста, представляющей собой название данного пункта меню (для разделительной линии этому параметру дается значениеNULL);

  • включение всплывающего меню в линейку меню и задание его имени той же функцией AppendMenu(), в качестве второго параметра которой следует указать константуMF­POPUP,в качестве третьего – дескриптор всплывающего меню, преобразованный в типUINT, а в качестве четвертого – адрес строки с названием всего всплывающего меню;

  • присоединение всего меню к главному окну приложения функцией SetMenu().

Все эти действия удобнее всего выполнить в функции OnCreate();там же можно объявить символьные строки с названиями пунктов меню. На рис. 3.4 показано меню из программы 3-1 с комментариями, поясняющими использованную в этом разделе терминологию.

Рис. 3.4. Меню, созданное программно

Плавающее меню

В приложениях Windows широко используются плавающие меню (не путать с всплывающим меню, являющимся элементом обычного меню), активизируемые обычно щелчком правой клавиши мыши. Плавающее меню (рис. 3.5) появляется в том месте экрана, где в данный момент находится курсор мыши.

Рис. 3.5. Плавающее меню

Поскольку плавающее меню должно активизироваться нажатием правой клавиши мыши, в оконную функцию следует включить обработку сообщения WMRBUTTONDOWN, ивсе действия по созданию меню выполнить в функции обработки этого сообщения (назвав ее, например,OnRButtonDown()).Установка плавающего меню почти не отличается от программного создания обычного статического меню и включает в себя следующие действия:

  • создание всплывающего меню для помещения в него требуемого набора пунктов (пока пустого) функцией CreatePop­upMenu() с получением дескриптора всплывающего меню (линейка меню в этом случае не создается);

  • заполнение всплывающего меню конкретными пунктами функцией AppendMenu() в точности так же, как и при создании обычного меню. Поскольку линейки меню в этом случае нет, всплывающее меню ни к чему не подсоединяется;

  • объявление созданного всплывающего меню плавающимфун­кциейTrackPopupMenu(). Второй параметр этой функции задается равным 0. В качестве следующих двух параметров следует указать текущие координаты курсора мыши. Всправке по функцииTrackPopupMenu() указано, что эта функция рассматривает передаваемые ей координаты как экранные, в то время как при вызове функцииOnRButtonDown() в нее передаются координаты относительно левого верхнего угла рабочей области окна; для коррекции координат можно воспользоваться функциейGetWindowRect(), которая возвращает текущие координаты левого верхнего угла окна приложения относительно начала экрана. Однако и в этом случае плавающее окно будет несколько смещено относительно положения указателя мыши, поскольку рабочая область окна не совпадает со всем пространством окна из-за наличия толстой рамки и строки заголовка. Для точного позиционирования плавающего меню относительно курсора мыши придется учесть размеры и этих элементов. Лучше всего получить координаты курсора мыши не из параметров функцииOnRButtonDown(), а непосредственно из пакета сообщения (структурной переменнойmsg), куда системой передаютсяэкранныекоординаты.