Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Подключение команды меню к коду программы




ClassWizard поможет подключить команду меню к обработчику, который будет запускаться при ее вызове из меню. Откройте окно ClassWizard.

Вы обнаружите, что идентификатор новой команды, ID_FILE_PRINTWELCOME, уже присутствует в списке Object IDs. Сейчас мы соединим команду с методом-обработчиком (проследите, чтобы в списке Classбыл выбран класс вида CMenusView). Выделите строкуID_FILE_PRINTWELCOME (идентификатор команды) в списке Object IDs, затем щелкните на строке Commandв списке Messages(она соответствует выполнению команды меню). ClassWizard предложит присвоить обработчику имя OnFilePrintWelcome()— нажмите кнопку ОК. После этого новый метод появляется в списке Member functions окна ClassWizard.

Дважды щелкните на строке OnFilePrintWelcome() в списке Member functions, и в окне справа появится код метода:

void CMenusView::OnFilePrintwelcome()

{

// TODO: добавьте код обработки сообщения

}

 Этот метод будет вызываться при выполнении пользователем команды Print Welcome, поэтому в него следует поместить соответствующий код. В нашем примере при выполнении команды должна выводиться строка "Добро пожаловать в меню!", поэтому мы должны выделить в объекте документа место для хранения этой строки:

 // menusDoc.h : интерфейс класса CMenusDoc

// Реализация

public:

virtual ~CMenusDoc();

CString StringData;

В конструкторе документа StringData объект будет инициализироваться пустой строкой:

CMenusDoc::CMenusDoc()

{

        StringData = "";

}

Далее в методе OnFilePrintwelcome(), принадлежащем объекту вида, мы получаем указатель pDocна объект документа:

void CMenusView::OnFilePrintWelcome()

{

        CMenusDoc* pDoc = GetDocument();

        ASSERT_VALID(pDoc);

}

Остается лишь занести в объект StringDataстроку "Добро пожаловать в меню!", отобразить ее в окне. Для этого мы объявим вид недействительным, чтобы метод OnDraw()сделал всю работу за нас:

void CMenusView::OnFilePrintWelcome()

{

CMenusDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

 pDoc->StringData = "Добро.пожаловать в меню!";

 Invalidate();

}

Наконец, мы добавляем в OnDraw() код для вывода строки:

void CMenusView::OnDraw(CDC* pDC)

{

CMenusDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->TextOut(0, 0, pDoc->StringData);

}

Запустите программу; в меню Fileпоявилась новая команда. Выберите ее, и в клиентской области программы появится строка "Добро пожаловать в меню!". Наша новая программа успешно справляется со своей задачей, а мы приступили работе с меню!

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

Программа для полноценной работы с меню

Мы узнаем, как создать новое меню, как заблокировать его команды (то есть окрасить их серым цветом и сделать так, чтобы пользователь не мог их выбрать), как поместить команду (поместив "галочку" перед ее именем в меню). Кроме того, мы добавим в программу подменю, клавиши ускоренного вызова (для быстрого выбора команд открытого меню), организуем вывод справочной информации в строке состояния (в нижней части главного окна программы), кнопки на панели инструментов и подсказки (подсказкой называется маленькое желтое окно, в котором появляется справка, если задержать указатель мыши над управляющим элементом, например, над кнопкой). Наконец, мы научимся определять акселераторы — сочетания клавиш, при помощи которых можно выбирать команды даже в закрытых меню.

В новую программу fullmenusмы добавим новое меню и назовем его Demo. В нем будут содержаться заблокированная команда, помеченная команда, а также команда, открывающая подменю.

Когда пользователь выбирает последнюю команду, открывается подменю с дополнительными командами.

Кроме того, в нашей программе будут присутствовать акселераторы, подсказка-справка в строке состояния и т. д. Сделать предстоит немало, поэтому давай перейдем к делу.

Создайте при помощи AppWizard SDI-программу с именем fullmenus. Откройте ресурс меню, IDR_MAINFRAME, в редакторе меню. Начнем с добавления меню Demo. Оно должно располагаться между меню Fileи Edit. Выделите (щелчком) меню Editв редакторе и нажмите клавишу InsertВ строке появится новое меню; дважды щелкните на нем и присвойте ему имя Demoв окнеMenu Item Properties (несмотря на то, что мы работаем с меню, а не с отдельной командой, Visual C++ продолжает использовать окноMenu Item Properties, поскольку в нем не существует специального окна Menu Properties для подменю). В cтроке появляется меню Demo.

Теперь мы должны добавить в меню Demoкоманды; Редактор меню уже включил в него пустую команду — щелкните на ней и дайте ей имя Grayed. Присвойте ей идентификатор ID_DEMO_GRAYED.

Эта команда будет заблокированной, то есть недоступной для пользователя. Аналогичным образом добавьте команды Checkedи Submenus. Достаточно дать командам эти имена, и редактор меню автоматически присвоит им нужные идентификаторы.

Добавление клавиш ускоренного вызова

Буква D в названии меню Demo подчеркнута; это означает, что если пользователь нажмет Alt+D, откроется меню Demo. Благодаря этому появляется возможность вызывать меню с помощью клавиатуры. Команде Submenuменю Demo назначена клавиша ускоренного вызова S. Если пользователь нажметAlt+S при открытом меню Demo, на экране появится подменю с дополнительными командами.

ВНИМАНИЕ! При выборе клавиш ускоренного вызова для меню или отдельных команд проследите, чтобы они не повторялись. В противном случае программа не сможет разобраться, что она должна делать при нажатии той или иной клавиши ускоренного вызова.

Создать клавишу ускоренного вызова очень просто - достаточно вставить символ "амперсанд" (&) перед той буквой в названии меню или команды, которая будет использоваться для ускоренного вызова. Например, чтобы использовать букву G для ускоренного вызова команды Grayed, измените название команды на&Grayed.

Аналогично задаются клавиши ускоренного вызова и для других команд меню. Клавиши ускоренного вызова готовы к работе.

Вывод справки в строке состояния

Когда пользователь выделяет команду меню, в строке состояния — полосе в нижней части окна программы — можно вывести дополнительную информацию. Для этого достаточно разместить нужный текст в поле Promptокна Menu Item Properties.  

В нашем примере приведен справочный текст Команда заблокирована, который выводится в строке состояния при выборе пользователем команды Grayed. Как видите, все очень просто — теперь этот текст будет появляться в строке состояния, когда пользователь задержит указатель мыши над этой командой меню.

Давайте посмотрим, как добавить в меню Demo подменю.  

Добавление подменю

Чтобы по команде Submenusна экране открывалось подменю, выполните следующие действия:

1. Дважды щелкните мышью на команде Submenusв редакторе меню — откроется окноMenu Item Properties.

2. Установите флажок Pop-up.

3. В команде Submenuоткрывается новое подменю с одной пустой командой.

4. Если выбрать эту команду в редакторе меню, на экране появляется подменю.

5. Мы включим в последнее две команды: Sub Item 1и Sub Item 2. Воспользуйтесь стандартным способом — дважды щелкните на пустой команде и задайте для нее имя в окне Menu Item Properties.

6. Предварительная работа по созданию подменю завершена. Остается лишь добавить необходимый код, чем мы и займемся вскоре.

Добавление акселераторов

Акселераторомназывается сочетание клавиш, которое пользователь может нажать в любой момент (даже при закрытом меню) и которое равносильно выбору команды меню. В нашем случае сочетание клавиш Ctrl+М действует так же, как команда Sub Item 2.

Чтобы создать акселератор для команды меню, выполните следующие действия:

1. Переидите в окно просмотра и откройте в списке ресурсов папку Accelerator.

2. Двойной щелчок на папке Accelerator— запускается редактор акселераторов.

3. Дважды щелкните на последней пустой строке в списке акселераторов — открывается окно Accelerator Properties.

4. Выберите идентификатор команды Sub Item 2, ID_DEMO_SUBMENUS_SUBITEM2. Если ввести несколько начальных символов идентификатора при открытом списке, он будет выбран автоматически. Если это не происходит,наберите идентификатор вручную.

5. Чтобы связать сочетание клавиш Ctrl+М с данным акселератором, установите флажок Ctrlв группе Modifiers.

6. Затем наберите в списке Keyбукву М (лат.) (сокращение VK означает "virtual key", то есть "виртуальная клавиша").

7. Закройте окно Accel Properties. Теперь сочетание клавиш Ctrl+Мстанет акселератором команды меню Sub Item 2.

8. Чтобы указать на наличие акселератора для команды Sub Item 2, замените в редакторе меню ее название на Sub Item 2\tCtrl+М. \t - представляет собой код символа табуляции, поэтому в новом названии текст Ctrl+М будет расположен справа, что указывает на то, что это сочетание клавиш является акселератором для команды меню.

Акселератор готов, а теперь мы займемся размещением новой кнопки на панели инструментов.

 Добавление кнопок на панель инструментов

Любую команду меню можно продублировать на панели инструментов в виде кнопки. Давайте создадим такую кнопку для команды Sub Item 1.

Для начала выберем внешний вид кнопки. Откройте в окне просмотра папку Toolbarи щелкните в строке IDR_MAINFRAME. Изображение кнопки появится в графическом редакторе.

Мы ограничимся простейшим изображением — рамкой. Для этого нам понадобится инструмент в виде карандаша из панели редактора, расположенной справа. Щелкните на пустой кнопке в левой части панели инструментов и нарисуйте рамку на ее увеличенном изображении.

Дважды щелкните на новой кнопке на панели инструментов - открывается окноToolbar Button Properties. Выберите из списка строку ID_DEMО_SUBMENUS_SUBITEM1, чтобы связать команду меню с кнопкой на панели инструментов.

Занесите в полеPrompt текст Sub menu 1\nSub menu 1. Это означает, что когда пользователь задержит указатель мыши над новой кнопкой, в строке состояния появится текст Sub menu 1. Кроме того, текст за символом\nбудет выведен в качестве экранной подсказки возле кнопки. В нашем случае подсказка будет состоять из текстаSub menu 1.

Теперь мы должны сделать так, чтобы команда Grayedдействительно была заблокированной, то есть неактивной.

Блокировка команд меню

Давайте заблокируем одну из команд меню. Откройте ClassWizard (выберите Class Name = CfullMenusView) и найдите в списке Object IDs строку ID_DEMO_GRAYED. Теперь свяжите с этим идентификатором метод-обработчик, но вместо знакомой строки COMMANDщелкните рсписке Messages на строке UPDATE_COMMAND_UI. Сокращение UIозначает "user interface", то есть "пользовательский интерфейс".

В результате будет создан новый метод OnUpdateDemoGrayed ():

void CFullmenusView: :OnUpdateDemoGrayed(CCmdUI* pCmdUI)

{

// TODO: добавьте код для обновления

// пользовательского интерфейса команды

}

Этот метод будет вызываться программой перед отображением новой команды меню, и в нем можно заблокировать команду. Ему передается параметр pCmdUI, представляющий собой указатель на объект классаCCmdUI— методы этого класса перечислены в табл. 5.1.

Таблица 5.1. Методы класса CCmdUI

Метод Назначение
ContinueRouting Сообщает механизму передачи команд о необходимости продолжить пересылку текущего сообщения по цепочке обработчиков
Enable Устанавливает или снимает блокировку элемента пользовательского интерфейса, соответствующего данной команде
SetCheck Устанавливает пометку для элемента пользовательского интерфейса, соответствующего данной команде (Аргументы 1или 0).
SetRadio Аналогичен методу SetCheck, но применяется для переключателей
SetText Задает текст для элемента пользовательского интерфейса, соответствующего данной команде

В этом методе мы собираемся заблокировать команду меню; для этого следует вызватьметод Enable() объекта CCmdUI, передав ему значение false:

        void CFullmenusView: :OnUpdateDemoGrayed(CCmdUI* pCmdUI)

{

// TODO: добавьте код для обновления

// пользовательского интерфейса команды

pCmdUI->Enable(false);

}

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

Аналогично устанавливается пометка "галочкой" для команды Checked.   

Пометка команд меню  

Теперь необходимо связать метод OnUpdateDemoChecked() с сообщением UPDATE_COMMAND_UIдля команды Checked:

void CFullmenusView::OnUpdateDemoChecked(CCmdUI* pCmdUI)

{

// TODO: добавьте код для обновления  

// пользовательского интерфейса команды   

}

Чтобы установить пометку для команды Checked, мы сначала разблокируем методом Enable(), а затем вызовем методSetCheck() объекта CCmdUI с аргументом 1 (аргумент 0 удаляет пометку):

void CFullmenusView::OnUpdateDemoChecked(CCmdUI* pCmdUI)

{

// TODO: добавьте код для обновления  

// пользовательского интерфейса команды 

pCmdUI->Enable(true);

pCmdUI->SetCheck(1);

}

 Готово — теперь команда меню Checked будет отображаться с пометкой в виде "галочки". Наша программа почти завершена — осталось лишь добавить код, выводящий строку при выборе команд подменю.










Последнее изменение этой страницы: 2018-04-12; просмотров: 340.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...