Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Разработка Windows - приложений в среде Borland. Учебное пособие
.pdf
мещать мышкой сам ползунок, значения можно менять на произвольную целую величину.
Теперь создадим функцию-обработчик события WM_TIMER.
Вызовите Class Expert → выберите в панели «Classes» класс диалога
TWorkDlgClient → раскройте список событий диалога Windows
Messages → затем список Other Messages → найдите событие
WM_TIMER и перегрузите его → команда контекстного меню Add
handler. Имя функции-обработчика задавать не требуется – оно
пре-
допределено. В созданную заготовку функции EvTimer поместите
инструкции:
char buff[10];
wsprintf( buff, "%i", slider1 -> GetPosition());
edit2->SetText( buff);
Метод GetPosition класса THSlider позволяет получить численное значение, выбранное пользователем в диалоговом окне с помощью ползунка. Это значение далее записывается в символьный
массив buff, а затем копируется в поле edit2 второй вкладки с помощью функции SetText.
К
ОНТЕКСТНОЕ МЕНЮ
В приложениях Windows нередко дополнительно предусматривается такой элемент интерфейса, как контекстное меню, вызываемое щелчком правой кнопки мыши в определенных областях окна
или на элементах управления. Во всех разделах данного пособия мы
постоянно пользовались контекстным меню, имеющимся в среде
Borland. Ниже рассматриваются возможные способы создания и
подключения констекстного меню в
разрабатываемые приложения.
Создайте новый проект Work на основе диалога. Поместите в
окно диалога поле и создайте соответствующий объект Edit1 (Class
Expert → Add instance variable). Вызовите редактор ресурсов и добавьте ресурс нового меню. Для этого откройте редактор ресурсов и
выберите в контекстном меню пункт New Resource (новый ресурс).
В появившемся диалоге выберите тип нового ресурса – MENU
и,
нажав на кнопку «Options», вид заготовки меню – Simple menubar.
Создайте два пункта меню – «Первый» и «Второй». Задайте имена
191

идентификаторов – CM_FIRST и CM_SECOND. Выйдите из режима
редактирования меню и запомните идентификатор ресурса меню –
далее предполагается, что – это IDM_MENU1. Закройте редактор
ресурсов и отредактируйте файл ресурсов workapp.rc как тестовый,
убрав выпадающее меню (в приведенном ниже фрагменте ресурса
строчки, которые требуется убрать, просто закомментированы):
IDM_MENU1 MENU
{
// POPUP ""
// {
MENUITEM "Первый", CM_FIRST
MENUITEM SEPARATOR
MENUITEM "Второй", CM_SECOND
// }
}
Снова вызовите редактор ресурсов и
го меню с пунктами «Третий» и «Четвертый» и идентификаторами
CM_THIRD и CM_FORTH. Запомните идентификатор ресурса меню
– далее в коде предполагается, что – это IDM_MENU2. Отредакти-
руйте ресурс, убрав выпадающее меню, аналогично предыдущему
случаю. Контекстное меню явлется объектом класса TPopupMenu,
поэтому откройте файл wrkdlgcl.h и добавьте в описание класса
диалога
руктора класса создайте контекстные меню для окна диалога и поля
Edit1:
которое пока только предполагается использовать, а для поля Edit1
указатель:
TPopupMenu* PPopupMenu;
В файле реализации класса диалога wrkdlgcl.cpp в конце конст-
PPopupMenu = new TPopupMenu(TMenu(*GetApplication(),
IDM_MENU1));
Edit1->AssignContextMenu(new TpopupMenu (Tmenu (*GetApplication (), IDM_MENU2)));
Здесь создается указатель на контекстное меню PpopupMenu,
192
добавьте ресурс еще одно-

контекстное меню не только создается, но и прикрепляется к полю с
помощью метода AssignContextMenu класса TWindow. В деструктор класса диалога добавьте строчку:
delete PPopupMenu;
Вызовите Class Expert → раскройте список событий диалога
Windows Messages → затем список Basic Messages → найдите собы-
тие WM_RBUTTONDOWN (щелчок правой кнопки мыши) и перегрузите его. В созданную заготовку функции
ClientToScreen(point);
PPopupMenu->TrackPopupMenu(TPM_RIGHTBUTTON, point, 0,
*this);
Функция ClientToScreen класса TWindow переводит координа-
ты точки окна point, полученные через параметр функции EvRBut-
tonDown, в экранные координаты, а метод TrackPopupMenu класса
TPopupMenu создает контекстное меню для окна диалога и обраба-
тывает выбор в меню.
Вызовите Class Expert → затем выберите в панели «Classes»
класс диалога TWorkDlgClient → раскройте список Command Noti-
fication класса диалога (будьте внимательны – команды меню дос-
тупны также в классе главного окна TSDIDecFrame и классе приложения TWorkApp), найдите команды меню CM_FIRST и CM_SE-
COND, раскройте список событий и создайте функции обработчики
для пунктов Command – выбор команды меню пользователем. В
заготовки созданных Class Expert функций поместите инструкцию:
MessageBox("Первый");
для команды меню «Первый», а для
MessageBox("Второй");
Запустите программу. Контекстное меню окна будет вызываться после щелчка правой кнопки мыши в клиентской области окна и
правильно работать, а контекстное меню поля Edit1 только отобра-
команды «Второй» строчку:
поместите инструкции:
193

жаться. Для придания функциональности второму меню требуется
создать функции-обработчики команд CM_THIRD и CM_FORTH, но
этого в данном случае недостаточно.
Создайте функции-обработчики команд CM_THIRD и CM_FORTH, аналогично командам меню окна диалога. Далее перегрузите в классе диалога TWorkDlgClient функцию PreProcessMsg: создайте с помощью эксперта классов заготовку этой функции (Class
Expert → Virtual Function → Add handler). Добавьте в нее
ции после комментария // INSERT>> Your code here.:
if(msg.wParam == CM_THIRD || msg.wParam == CM_FORTH)
SendMessage( msg.message, msg.wParam, msg.lParam);
Теперь сообщения, связанные с командами CM_THIRD и CM_FORTH, перехватываются и посылаются окну диалога, где и испол-
няются. В противном случае они поступят окну поля Edit1, где их
обработка не предусмотрена. Запустите программу. Теперь функционируют оба контекстных меню:
инструк-
Замечание: У стандартных элементов может изначально существовать собственное контекстное меню, которое, возможно, вполне
вас полностью устроит. В частности, элемент «редактируемое поле»
имеет такое меню:
194

ВСПЛЫВАЮЩИЕ ПОДСКАЗКИ
В заключение рассмотрим возможность дополнительного пояснения пользователю назначения различных элементов управления с
помощью механизма всплывающих подсказок. Всплывающая подсказка – это небольшое окошко с пояснительным текстом, появляющееся, если указатель мыши задержать несколько секунд над
элементом интерфейса, например над кнопкой. В OWL-программе
окно подсказки – это объект класса TTooltip, а для
кретного элемента (или просто области родительского окна) создается объект класса TToolInfo, содержащий нужный текст.
Создайте простое Windows-приложение на основе диалогового
окна. Для удобства дальнейшего изложения назовите проект Work.
Поместите на форму кнопку «КНОПКА» и редактируемое поле.
Присвойте через ClassExpert имена объектам: кнопке – button1, полю – edit1:
Отредактируйте модуль wrkdlgcl.h – добавьте в описание класса диалога указатель на создаваемую подсказку:
TTooltip* tooltip;
а в начало файла директиву препроцессора:
#include <owl/tooltip.h>
Создать элемент управления «подсказка» можно, например, в
перегруженной функции SetupWindow. Вызовите ClassExpert, в панели «Классы» выберите наш класс диалога TWorkDlgClient, в панели «События» раскройте список виртуальных функций, найдите
функцию SetupWindow
и перегрузите ее (контекстное меню – Add
каждого кон-
195

handler). Добавьте в созданную ClassExpert заготовку метода SetupWindow инструкции:
tooltip = new TTooltip(this);
tooltip->Create();
TToolInfo ti1(*this, TRect(0,0,100,100), 10001, "это окно диа-
лога!");
TToolInfo ti2(*this, *edit1, "это поле!");
TToolInfo ti3(*this, *button1, "это кнопка!");
tooltip->AddTool(ti1);
tooltip->AddTool(ti2);
tooltip->AddTool(ti3);
Объект «подсказка» создается с помощью конструктора класса
TTooltip, обязательным параметром которого является указатель на
родительское окно, в данном случае – окно диалога. Конструктор
создает только объект TTooltip, но не окно «подсказки». Само окно
создается с
частности текст подсказки и область окна, для которой этот текст
должен отображаться, содержится в объектах класса TToolInfo, которые помещаются в элемент управления «подсказка» методом Add-
Tool. В классе TToolInfo определены различные конструкторы.
В приведенном фрагменте кода подсказка, связанная с областью
окна, определенной заданными координатами, создана конструктором, первым параметром которого является окно (у нас окно диалога), второй параметр определяет область окна, для которой предназначена подказка. Данная область должна задаваться объектом класса TRect. В конструкторе этого класса задаются координаты левого
верхнего угла области (0,0) и правого нижнего угла (100,100). Третий параметр – это идентификатор подсказки. Поскольку в
ресурсов соответствующий идентификатор мы не определили (а
могли бы), идентификатор задан целой константой. Наконец четвертый параметр задает желаемый текст.
Подсказки, предназначенные для элементов управления кнопка
(button1), и редактируемое поле (edit1) создаются с помощью дру-
гого конструктора, первые два параметра которого определяют родительское окно и нужный элемент управления
тий параметр задает нужный текст подсказки.
помощью функции Create. Необходимая информация, в
файле
соответственно. Тре-
196

Для того чтобы сообщения, связанные с движением мыши, передавались элементу управления «подсказка» (объект tooltip), необходимо перегрузить в классе диалога TWorkDlgClient функцию
PreProcessMsg. Создайте с помощью эксперта классов заготовку
этой функции (аналогично тому, как это был перегружен метод
SetupWindow) и добавьте после комментария инструкцию, посылающую нужное сообщение элементу tooltip:
tooltip->RelayEvent(msg);
Запустите программу
Появится определенная нами подсказка «это кнопка!»:
Если указатель мыши задержать на редактируемом поле, появится подсказка «это поле!» Подсказка «это окно диалога!» появится, если указатель находится в левой верхней части окна диалога, но
не на элементах управления.
и поместите указатель мыши на кнопку.
197

ЛИТЕРАТУРА
1. Карниган Б., Ричи Д. Язык программирования Си. / Пер. с англ.
2-е изд. – М.: Издательский дом «Вильямс», 2005. – 304 с.: ил.
2. Павловская Т.А. С/С++. Программирование на языке высокого
уровня. – СПб.: Питер, 2006. – 461 с.: ил.
3. Шилдт Герберт. Справочник программиста по C/C++. 3-е изд.:
Пер. с англ. – М.: Издательский дом «Вильямс
ил.
4. Страуструп Бьерн. Язык программирования С++. Специальное
издание. / Пер. с англ. – СПб.; М.: БИНОМ - ПРЕСС, 2006 г. –
1104 с.: ил.
5. Киммел П. и др. Borland C++ 5. Пер. с англ. – СПб.: БХВ – Пе-
тербург, 2001. – 976 с.: ил.
6. Дерк Луис. Borland C++ 5: Справочник / Пер. с нем. - М.:
БИНОМ, 1997. – 560 с.: ил.
7. Галявов И.Р. Borland C++ 5 для
432 с.: ил.
8. Тихомиров Ю.В. Самоучитель MFC. – СПб.: БХВ – Петербург,
2002. – 640 с.: ил.
9. Финогенов К.Г. Win32. Основы программирования. – М.:
ДИАЛОГ – МИФИ, 2006. – 416 с.
10. Румянцев П.В. Азбука программирования в Win32 API. – 3-е
изд., дополн. – М.: Горячая линия – Телеком, 2004. – 312 с.: ил.
11. Мейн Майкл, Савич Уолтер. Структуры данных
ты в С++. 2-е изд. / Пер. с англ. – М.: Издательский дом «Вильямс», 2002. – 832 с.: ил.
12. Верма Р.Д. Справочник по функциям Win32 API. – М.: Горячая
линия – Телеком, 2005. – 551 с.: ил.
13. Щупак Ю.А. Win32 API. Эффективная разработка приложений.
– СПб.: Питер, 2007. – 572 с.: ил.
14. Саймон Р. Microsoft Windows 2000 API: Энциклопедия програм-
миста. – Киев: ДиаСофт
, 2001. – 1008 с.
себя. – М.: ДМК Пресс, 2001. –
198
». – 2006. – 432 с.:
и другие объек-

МАСЛЯНКИН Вячеслав Иванович
Р
АЗРАБОТКА WINDOWS-ПРИЛОЖЕНИЙ В СРЕДЕ BORLAND
Учебное пособие
Редактор Голева А.В.
Компьютерная верстка Матюхиной Е.М.
Оригинал-макет подписан к печати 01.08.2007 г. Формат 60х90/16.
Гарнитура таймс. Бумага офсетная. Печать офсетная. Печ. л. 12,5.
Уч.-изд. л. 11,62. Тираж 500 экз. Заказ №
Российский новый университет. 105005, Москва, ул. Радио, д. 22.
Отпечатано в ГУП МО «
Орехово-Зуевская типография».
г. Орехово-Зуево Московской области, ул. Дзержинского, д. 1.
E-mail: tipografiya-oz@rambler.ru
199

ДЛЯ ЗАМЕТОК
200
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
