Московский инженерно-физический институт
Вид материала | Практикум |
СодержаниеПлавающее меню Инструментальная панель Id_btns bitmap "btns.bmp" |
- Ю. С. Барсуков 1, А. Ю. Окунев 2 1 Московский инженерно-физический институт (государственный, 29.25kb.
- В. А. Курнаев Московский инженерно-физический институт (государственный университет),, 27.18kb.
- «Вегето-сосудистая дистония», 192.12kb.
- Перечен ь научных разделов и базовых вузов по научным разделам открытого конкурса, 247.02kb.
- Д. В. Гуцко Московский инженерно-физический институт (государственный университет), 34.47kb.
- В. А. Тумольский московский инженерно-физический институт (государственный университет), 27.44kb.
- К. С. Чистов Московский инженерно-физический институт (государственный университет), 24.11kb.
- Вдокладе рассматривается задача оценки рисков инвестиционных проектов электростанций, 29.4kb.
- Резюме Луценко Владимир Юрьевич, 22.32kb.
- Л. Ю. Грецкая московский инженерно-физический институт (государственный университет), 26.28kb.
Плавающее меню
В приложениях Windows широко используются плавающие меню (не путать с всплывающим меню, являющимся элементом обычного меню), активизируемые обычно щелчком правой клавиши мыши. Плавающее меню (рис. 3.5) появляется в том месте экрана, где в данный момент находится курсор мыши.

Рис. 3.5. Плавающее меню
Поскольку плавающее меню должно активизироваться нажатием правой клавиши мыши, в оконную функцию следует включить обработку сообщения WMRBUTTONDOWN, и все действия по созданию меню выполнить в функции обработки этого сообщения (назвав ее, например, OnRButtonDown()). Установка плавающего меню почти не отличается от программного создания обычного статического меню и включает в себя следующие действия:
- создание всплывающего меню для помещения в него требуемого набора пунктов (пока пустого) функцией CreatePopupMenu() с получением дескриптора всплывающего меню (линейка меню в этом случае не создается);
- заполнение всплывающего меню конкретными пунктами функцией AppendMenu() в точности так же, как и при создании обычного меню. Поскольку линейки меню в этом случае нет, всплывающее меню ни к чему не подсоединяется;
- объявление созданного всплывающего меню плавающим функцией TrackPopupMenu(). Второй параметр этой функции задается равным 0. В качестве следующих двух параметров следует указать текущие координаты курсора мыши. В справке по функции TrackPopupMenu() указано, что эта функция рассматривает передаваемые ей координаты как экранные, в то время как при вызове функции OnRButtonDown() в нее передаются координаты относительно левого верхнего угла рабочей области окна; для коррекции координат можно воспользоваться функцией GetWindowRect(), которая возвращает текущие координаты левого верхнего угла окна приложения относительно начала экрана. Однако и в этом случае плавающее окно будет несколько смещено относительно положения указателя мыши, поскольку рабочая область окна не совпадает со всем пространством окна из-за наличия толстой рамки и строки заголовка. Для точного позиционирования плавающего меню относительно курсора мыши придется учесть размеры и этих элементов. Лучше всего получить координаты курсора мыши не из параметров функции OnRButtonDown(), а непосредственно из пакета сообщения (структурной переменной msg), куда системой передаются экранные координаты.
Инструментальная панель
Дальнейшего улучшения внешнего вида приложения можно добиться, включив в состав главного окна, наряду с линейкой меню (или вместо нее), инструментальную панель, которая представляет собой набор кнопок с рисунками, действующих точно так же, как и пункты обычного меню. Эти кнопки могут дублировать отдельные команды меню, но могут и дополнять их. На рис. 3.6 показана часть главного окна среды программирования Borland C++ со строкой заголовка, линейкой обычного меню (File, Edit и т. д.) и инструментальной панелью с пиктограммами стандартных действий (чтение и сохранение файла, компиляция, выполнение и т. д.).

Рис. 3.6. Обычное меню и инструментальная панель
Для создания инструментальной панели необходимо прежде всего подготовить файл с растровым изображением рисунков на кнопках (в формате .BMP). Могут быть разные варианты размещения кнопок (вплотную друг к другу, с промежутками, группами и т. д.). Обычно кнопки имеют размер 1616 пикселов, и тогда для размещения на инструментальной панели, например, трех кнопок, нужно создать растровое изображение размером 1648 пикселов (рис. 3.7). Разумеется, рисунки на кнопках могут быть цветными.

Рис. 3.7. Изображение трех кнопок для инструментальной панели
Поскольку изображение кнопок будет выступать у нас в качестве ресурса, в файл ресурсов необходимо включить ссылку на файл с изображением кнопок, например, таким образом:
ID_BTNS BITMAP "BTNS.BMP"
Здесь ID_BTNS – произвольная символическая константа, которая затем будет использоваться в качестве идентификатора данного ресурса, а BTNS.BMP – имя файла с изображением кнопок.
Действия по программной организации инструментальной панели удобно выполнить в функции OnCreate(). Здесь прежде всего создается (и обнуляется) структурная переменная – массив из трех (по числу кнопок) структур типа TBBUTTON. Эта структура описана в заголовочном файле COMMCTRL.H, который не подсоединяется автоматически, поэтому в начало программы необходимо включить директиву
#include
Структура TBBUTTON содержит шесть элементов, из которых нас будут интересовать всего три:
- idBitmap – порядковый номер кнопки (кнопки нумеруются от 0);
- idCommand – идентификатор кнопки (определенная заранее символьная константа);
- fsState – состояние кнопки. Значение TBSTATEENABLED разрешает управление с помощью данной кнопки.
После заполнения перечисленных выше элементов во всех трех (если кнопок три) членах нашего массива следует вызвать функцию Windows CreateToolbarEx(), указав в качестве ее параметров:
- дескриптор главного окна;
- стиль инструментальной панели (значение WSVISIBLE);
- идентификатор всей инструментальной панели, который в программе не используется и может быть равен, например, -1;
- число изображений кнопок в файле .BMP;
- дескриптор приложения;
- идентификатор ресурса с изображением кнопок;
- адрес массива структур типа TBBUTTON;
- число кнопок;
- ширину и высоту каждой кнопки;
- ширину и высоту изображения на каждой кнопке (размеры кнопок и изображений на них в принципе могут не совпадать);
- размер структуры TBBUTTON, определяемый с помощью функции С++ sizeof().
При нажатии кнопки инструментальной панели Windows посылает в приложение сообщение WMCOMMAND, которое приводит к вызову функции OnCommand() с передачей через второй параметр этой функции значения идентификатора нажатой кнопки. Обычно в функции OnCommand() предусматривают конструкцию switch-case, с помощью которой организуют анализ значения идентификатора и выполнение запланированных действий. Если при этом в приложении имеются и обычное меню, и инструментальная панель, то при назначении пунктам меню и кнопкам инструментальной панели одинаковых идентификаторов они будут дублировать друг друга, если же идентификаторы будут разными, то с помощью меню можно управлять одними характеристиками приложения, а с помощью инструментальной панели – другими.