Московский инженерно-физический институт

Вид материалаПрактикум

Содержание


Плавающее меню
Инструментальная панель
Id_btns bitmap "btns.bmp"
Подобный материал:
1   ...   8   9   10   11   12   13   14   15   ...   24

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


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



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

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

Инструментальная панель


Дальнейшего улучшения внешнего вида приложения можно добиться, включив в состав главного окна, наряду с линейкой меню (или вместо нее), инструментальную панель, которая представляет собой набор кнопок с рисунками, действующих точно так же, как и пункты обычного меню. Эти кнопки могут дублировать отдельные команды меню, но могут и дополнять их. На рис. 3.6 показана часть главного окна среды программирования Borland C++ со строкой заголовка, линейкой обычного меню (File, Edit и т. д.) и инструментальной панелью с пиктограммами стандартных действий (чтение и сохранение файла, компиляция, выполнение и т. д.).



Рис. 3.6. Обычное меню и инструментальная панель

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



Рис. 3.7. Изображение трех кнопок для инструментальной панели

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

ID_BTNS BITMAP "BTNS.BMP"

Здесь ID_BTNS – произвольная символическая константа, которая затем будет использоваться в качестве идентификатора данного ресурса, а BTNS.BMP – имя файла с изображением кнопок.

Действия по программной организации инструментальной панели удобно выполнить в функции OnCreate(). Здесь прежде всего создается (и обнуляется) структурная переменная – массив из трех (по числу кнопок) структур типа TBBUTTON. Эта структура описана в заголовочном файле COMMCTRL.H, который не подсоединяется автоматически, поэтому в начало программы необходимо включить директиву

#include .

Структура TBBUTTON содержит шесть элементов, из которых нас будут интересовать всего три:
  • idBitmap – порядковый номер кнопки (кнопки нумеруются от 0);
  • idCommand – идентификатор кнопки (определенная заранее символьная константа);
  • fsState – состояние кнопки. Значение TBSTATEENABLED разрешает управление с помощью данной кнопки.

После заполнения перечисленных выше элементов во всех трех (если кнопок три) членах нашего массива следует вызвать функцию Windows CreateToolbarEx(), указав в качестве ее параметров:
  • дескриптор главного окна;
  • стиль инструментальной панели (значение WSVISIBLE);
  • идентификатор всей инструментальной панели, который в программе не используется и может быть равен, например, -1;
  • число изображений кнопок в файле .BMP;
  • дескриптор приложения;
  • идентификатор ресурса с изображением кнопок;
  • адрес массива структур типа TBBUTTON;
  • число кнопок;
  • ширину и высоту каждой кнопки;
  • ширину и высоту изображения на каждой кнопке (размеры кнопок и изображений на них в принципе могут не совпадать);
  • размер структуры TBBUTTON, определяемый с помощью функции С++ sizeof().

При нажатии кнопки инструментальной панели Windows посылает в приложение сообщение WMCOMMAND, которое приводит к вызову функции OnCommand() с передачей через второй параметр этой функции значения идентификатора нажатой кнопки. Обычно в функции OnCommand() предусматривают конструкцию switch-case, с помощью которой организуют анализ значения идентификатора и выполнение запланированных действий. Если при этом в приложении имеются и обычное меню, и инструментальная панель, то при назначении пунктам меню и кнопкам инструментальной панели одинаковых идентификаторов они будут дублировать друг друга, если же идентификаторы будут разными, то с помощью меню можно управлять одними характеристиками приложения, а с помощью инструментальной панели – другими.