Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Разработка Windows - приложений в среде Borland. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
мещать мышкой сам ползунок, значения можно менять на произ­вольную целую величину.
Теперь создадим функцию-обработчик события 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 (*GetAp­plication (), 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 заготовку метода Setup­Window инструкции:
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]