Московский инженерно-физический институт
Вид материала | Практикум |
СодержаниеПлавающее меню Инструментальная панель 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) появляется в том месте экрана, где в данный момент находится курсор мыши.
![](images/124007-nomer-m7210377d.png)
Рис. 3.5. Плавающее меню
Поскольку плавающее меню должно активизироваться нажатием правой клавиши мыши, в оконную функцию следует включить обработку сообщения WMRBUTTONDOWN, и все действия по созданию меню выполнить в функции обработки этого сообщения (назвав ее, например, OnRButtonDown()). Установка плавающего меню почти не отличается от программного создания обычного статического меню и включает в себя следующие действия:
- создание всплывающего меню для помещения в него требуемого набора пунктов (пока пустого) функцией CreatePopupMenu() с получением дескриптора всплывающего меню (линейка меню в этом случае не создается);
- заполнение всплывающего меню конкретными пунктами функцией AppendMenu() в точности так же, как и при создании обычного меню. Поскольку линейки меню в этом случае нет, всплывающее меню ни к чему не подсоединяется;
- объявление созданного всплывающего меню плавающим функцией TrackPopupMenu(). Второй параметр этой функции задается равным 0. В качестве следующих двух параметров следует указать текущие координаты курсора мыши. В справке по функции TrackPopupMenu() указано, что эта функция рассматривает передаваемые ей координаты как экранные, в то время как при вызове функции OnRButtonDown() в нее передаются координаты относительно левого верхнего угла рабочей области окна; для коррекции координат можно воспользоваться функцией GetWindowRect(), которая возвращает текущие координаты левого верхнего угла окна приложения относительно начала экрана. Однако и в этом случае плавающее окно будет несколько смещено относительно положения указателя мыши, поскольку рабочая область окна не совпадает со всем пространством окна из-за наличия толстой рамки и строки заголовка. Для точного позиционирования плавающего меню относительно курсора мыши придется учесть размеры и этих элементов. Лучше всего получить координаты курсора мыши не из параметров функции OnRButtonDown(), а непосредственно из пакета сообщения (структурной переменной msg), куда системой передаются экранные координаты.
Инструментальная панель
Дальнейшего улучшения внешнего вида приложения можно добиться, включив в состав главного окна, наряду с линейкой меню (или вместо нее), инструментальную панель, которая представляет собой набор кнопок с рисунками, действующих точно так же, как и пункты обычного меню. Эти кнопки могут дублировать отдельные команды меню, но могут и дополнять их. На рис. 3.6 показана часть главного окна среды программирования Borland C++ со строкой заголовка, линейкой обычного меню (File, Edit и т. д.) и инструментальной панелью с пиктограммами стандартных действий (чтение и сохранение файла, компиляция, выполнение и т. д.).
![](images/124007-nomer-m458d9436.png)
Рис. 3.6. Обычное меню и инструментальная панель
Для создания инструментальной панели необходимо прежде всего подготовить файл с растровым изображением рисунков на кнопках (в формате .BMP). Могут быть разные варианты размещения кнопок (вплотную друг к другу, с промежутками, группами и т. д.). Обычно кнопки имеют размер 1616 пикселов, и тогда для размещения на инструментальной панели, например, трех кнопок, нужно создать растровое изображение размером 1648 пикселов (рис. 3.7). Разумеется, рисунки на кнопках могут быть цветными.
![](images/124007-nomer-m40cf2c1d.jpg)
Рис. 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, с помощью которой организуют анализ значения идентификатора и выполнение запланированных действий. Если при этом в приложении имеются и обычное меню, и инструментальная панель, то при назначении пунктам меню и кнопкам инструментальной панели одинаковых идентификаторов они будут дублировать друг друга, если же идентификаторы будут разными, то с помощью меню можно управлять одними характеристиками приложения, а с помощью инструментальной панели – другими.