Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 106

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 100 101 102 103 104 105 < 106 > 107 108 109 110 111 112 .. 204 >> Следующая

void CMiniDrawDoc::OnUpdateEditClearAll(CCmdUI*,pCmdUI) {
// TODO: Здесь добавьте собственный код обработчика pCmdUX->Enable (m_LineArray.GetSize ());
}
Функции OnUpdateEditClearAll передается указатель на объект класса CCmdUI. Это MFC-класс, предоставляющий функции для инициализации команд меню и других объектов пользовательского интерфейса. Добавленный код вызывает функцию Enable класса CCmdUI. Она делает доступной команду меню Delete All, если документ содержит хотя бы одну линию. В противном случае блокирует команду, которая отображается затененной серым цветом, и пользователь не может ее выбрать. Таким образом, функцию OnEditClearAll нельзя вызвать, если документ пуст.
Инициализация команд меню
В функцию, которая обрабатывает сообщение update_COMMand_ui команды меню, передается указатель на объект класса CCmdUI, связанный с выбранной командой. Класс CCmdUI предоставляет четыре функции, которые можно использовать для инициализации команд: Enable, SetCheck, SetRadio и SetText.
Чтобы сделать команду доступной, в функцию Enable передается значение TRUE, а для блокирования команды - FALSE.
virtual void Enable (BOOL bOn = true);
В функцию SetCheck можно передать значение 1, чтобы сделать пункт меню выбранным, или значение 0, чтобы отменить выбор.
virtual void SetCheck (int г.Check = 1);
Обычно команда меню, представляющая какую-либо функциональную возможность программы, отмечается, если данная возможность активизирована.
Чтобы отметить пункт меню с помощью специального маркера (кружка), можно передать значение true функции SetRadio, а чтобы удалить маркер -значение FALSE.
virtual void SetRadio (BOOL bOn = TRUE);
Наконец, чтобы изменить надпись команды меню, можно вызвать функцию SetText:
virtual void SetText (LPCTSTR IpszText);
где IpszText — указатель на новую строку текста. Например, если предыдущее действие состояло в удалении текста, то для замены команды Undo на Undo Delete можно вызвать функцию SetText.
Как показано в гл. 14, можно определить обработчики сообщений ирdatE_COMMANd_uI и для других объектов пользовательского интерфейса, например для кнопок панели инструментов. Для обновления этих объектов можно использовать те же четыре функции класса CCmdUI. Особенности работы каждой из этих функций зависят от типа объекта, с которым они взаимодействуют.
Обработка команды Undo
Последняя задача состоит в реализации функции обработки команды Undo меню Edit.
Сначала определим функцию, получающую управление, когда пользователь выбирает команду Undo. Чтобы сделать это, запустите мастер ClassWizard и выполните действия, описанные в предыдущем параграфе. Однако при выполнении пункта 3 в списке Object IDs выберите идентификатор id_edit_undo. Мастер ClassWizard создаст функцию с именем OnEditUndo. Добавьте в эту функцию следующий код.
void CMiniDrawDoc::OnEditUndo() {
// todo: Здесь добавьте собственный код обработчика int Index = m_LineArray.GetUpperBound () ; if (Index > -1) {
delete m_LineArray.GetAt (Index); m_LineArray.RemoveAt (Index); )
UpdateAllViews (0);
}
Для получения индекса последней линии в добавленном коде сначала вызывается функция GetUpperBound класса СОЬАггау. Затем с целью получения указателя на объект класса CLine для последней линии вызывается функция CTypedPtrArray: : GetAt, а для удаления этого объекта используется оператор delete. И, наконец, вызывается функция UpdateAllViews, которая удаляет окно представления и вызывает функцию CMiniDrawview: :OnDraw. После этого обработчик OnDraw перерисовывает линии, оставшиеся в документе. Обратите внимание:
при многократном выборе команды Undo обработчик OnEditUndo продолжает удалять линии до тех пор, пока не останется ни одной.
Теперь определите функцию инициализации команды меню Undo. Чтобы сделать это, воспользуйтесь алгоритмом, приведенными в предыдущем параграфе. Однако в пункте 3 из списка Object IDs выберите идентификатор id_edit_UNDO, а в пункте 4 из списка Message — идентификатор сообщения update_command_ui. Мастер ClassWizard создаст функцию с именем OnUpdateEditundo. Добавьте в эту функцию следующий код.
void CMiniDrawDoc::OnUpdateEditundo(CCmdUI* pCmdUI) {
// TODO: Здесь добавьте собственный код обработчика pCmdUI->Enable (m_LineArray. GetSize ());
)
Работа этой функции аналогична работе функции OnUpdateEditClearAll, описанной ранее. Она делает команду Undo доступной при наличии хотя бы одной линии для удаления.
Вспомните: для команды Undo была задана комбинация клавиш Ctrl+Z, т. е. и команда, и комбинация клавиш имеют идентификатор ideditundo. Когда пользователь нажимает CtrHZ, вызывается обработчик OnUpdateEditundo. Если функция OnUpdateEditundo делает команду меню доступной, вызывается функция OnEditUndo, так что нажатие горячих клавиш обрабатывается так же, как и выбор команды меню. Однако если функция OnUpdateEditundo блокирует команду меню, система не вызывает функцию OnEditUndo. Таким образом, комбинация клавиш также блокируется, и функция OnEditUndo не будет вызываться, если в документе нет ни одной линии.
Предыдущая << 1 .. 100 101 102 103 104 105 < 106 > 107 108 109 110 111 112 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100