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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
ния X и Y задают координаты верхнего левого угла окна на экране. Задайте значения:
frame->Attr.X=0;
frame->Attr.Y=0;
frame->Attr.W=100;
frame->Attr.H=50;
и запустите программу. Окно приложения появится в левом верхнем углу экрана, как мы и хотели, однако размеры окна практически не изменились. В данном случае это обусловлено стилями главного ок­на и дочернего – диалога. Размеры главного окна у нас подстраива­ются под размеры окна диалога.
Попытайтесь задать заголовок окна в редакторе через
свойство
Caption диалога. Ничего не получится, поскольку тот заголовок, ко-
торый мы видим, является заголовком главного окна, а не дочернего окна – диалога. Поменяем заголовок главного окна с помощью ме­тода SetCaption:
frame->SetCaption("Лучшая из программ");
Результат превзойдет ваши ожидания – все работает!
Нередко заголовок окна отражает текущее состояние програм­мы – изменение данных
в редакторах, имя файла данных и т.д. Ме­тод SetCaption как нельзя лучше подходит для этих целей. Единст­венный момент, на который нужно обратить внимание, это то, что нам необходим указатель на главное окно приложения. Если функ­ция является методом класса приложения, получить нужный указа­тель можно, применив метод GetMainWindow.
Добавьте после ин-
струкции (окно должно быть установлено!):
SetMainWindow(frame);
строчку:
GetMainWindow()->SetCaption("Простая программа");
Для объектов, являющихся потомками базового класса TWin-
dow (окон) имеется метод GetApplication, позволяющий получить
91
указатель на объект-приложение. Добавьте в модуле диалога
wrkdlgcl.cpp в конец функции-обработчик нажатия на кнопку «До­бавить» (BNClickedAdd) инструкцию:
GetApplication()->GetMainWindow()->SetCaption ("Данные из-
менены");
Запустите проект на исполнение и ведите в базу данных любую запись. После добавления записи заголовок окна изменится. Впро­чем, в данном случае главное окно является непосредственным ро­дителем окна диалога, поэтому в поле Parent (родительское окно) нашего класса диалога хранится указатель на главное окно прило­жения и нужная инструкция может выглядеть
проще:
Parent->SetCaption ("Данные изменены");
Можно получить значение заголовка (Title – указатель типа char*):
Parent->Title
и использовать это значение для организации ветвления в программе:
if( strcmp( Parent->Title, "Данные изменены") == 0) //нужные
действия,
//например, сохранение данных.
Вернитесь к функции InitMainWindow, определенной в модуле workapp.cpp. Для изменения цвета фона предназначен метод
SetBkgndColor. Допустимые цвета можно выбрать, например, из констант
, определенных в классе TColor, или создать с помощью
конструктора этого класса:
TColor(красный, зеленый, синий).
Интенсивность каждого цвета задается целым числом в диапа­зоне от нуля до 255. Попробуем задать зеленый цвет фона с помо­щью константы LtGreen:
frame->SetBkgndColor(TColor::LtGreen);
92
Цвет не изменился! Однако, если у вас достаточно «слабый» компьютер, можно заметить, что при завершении работы зеленый цвет мелькает. Хотелось бы надеяться, что вам уже все понятно – мы задали цвет клиентской области главного окна, а видим дочернее окно – диалог. Аналогичная ситуация возникала при подключении акселераторов. Следовательно, и решение аналогично. Определим зеленый
или зададим один из системных цветов:
InitMainWindow. Можно задать цвет фона в конструкторе класса диалога или в методах этого класса. В этих случаях код выглядит проще:
иконками. Найдите с помощью утилиты Windows: Пуск → Найти → Файлы и папки файлы типа «*.ico». Для удобства скопируйте понра­вившийся вам файл в папку проекта. Например, в папке, содержа­щей транслятор Borland, есть файл animals.ico. Вызовите редактор ресурсов и в контекстном меню выберите пункт Add to Project… :
цвет:
frame->GetFirstChild()->SetBkgndColor(TColor::LtGreen);
frame->GetFirstChild()->SetBkgndColor(TColor::SysInactiveCaption);
Теперь все нормально. Не обязательно пользоваться функцией
SetBkgndColor(TColor::LtBlue);
Теперь поменяем иконку. Сначала воспользуемся имеющимися
93
В комбинированном списке “List Files of Type” выберите нуж­ный тип ресурса – Icon Image (*.ico) и в списке “Files name” нужный файл (animals.ico):
Раскройте список ресурсов “Icon” и найдите новый ресурс:
Здесь этот ресурс имеет идентификатор IDI_ICON1. Запомните идентификатор и вернитесь к функции InitMainWindow модуля
workapp.cpp. Поменяйте в строках:
frame->SetIcon(this, IDI_SDIAPPLICATION);
frame->SetIconSm(this, IDI_SDIAPPLICATION);
идентификатор стандартной иконки IDI_SDIAPPLICATION на IDI_ICON1:
frame->SetIcon(this, IDI_ICON1);
frame->SetIconSm(this, IDI_ICON1);
94
Запустите программу. У нас новая иконка!
Напоследок создадим и подключим свою уникальную иконку. Снова вызовите редактор ресурсов, но теперь в контекстном меню редактора выберите пункт New Resource… . В диалоге New Re-
source выберите тип ресурса – Icon. Прежде чем нажимать кнопку “ОК” нажмите кнопку “Options…” и убедитесь, что выбран размер (Size) 32х32 и
16-цветный рисунок (Colors):
Подтвердите создание ресурса “ОК”. Вы попадете в графиче­ский редактор:
95
Окно редактора разделено на две панели. Можно работать в любой из них, увеличив масштаб командой контекстного меню Zoom In. Во второй панели рисунок останется в реальном масштабе, и можно видеть, как будет выглядеть ваша иконка. Здесь помещена также панель палитры цветов (Colors) и контекстное меню редакто­ра. В низу экрана расположена панель инструментов
(Tool Palette):
Кроме того, в основное меню Borland добавится меню Icon. Ес­ли панели палитры или инструментов не появились, выведите их с помощью контекстного меню. Работа в графическом редакторе ана­логична работе в редакторе Paint, поэтому подробно останавливать­ся мы не будем. Впрочем, можно рисовать не здесь, а создать рису­нок в другом графическом редакторе, например
в Paint, сжать рису­нок, скопировать и вставить в графический редактор Borland через буфер обмена.
После создания иконки запомните её идентификатор и закройте редактор. Здесь этот ресурс имеет идентификатор IDI_ICON2. Вер­нитесь к функции InitMainWindow модуля workapp.cpp и подключи­те вашу оригинальную иконку.
СТАНДАРТНЫЕ ДИАЛОГИ
Библиотека классов OWL содержит классы, поддерживающие работу со стандартными блоками диалогов, используемых приложе­ниями Windows. Это, например, диалоги открытия и сохранения файлов, печати, выбора шрифта, цвета и т.п. Кроме того, можно ис­пользовать и уже знакомые нам диалоговые окна сообщений – Mes­sageBox и окна ввода – TInputDialog. Рассмотрим подробнее воз­можности, предоставляемые нам встроенными диалогами Message­Box и TInputDialog.
Диалоговое окно сообщений – MessageBox
В классе TWindow функция MessageBox объявлена следующим образом:
int MessageBox(const char far* text,const char far* caption=0,uint
type=MB_OK );
96
т.е. первым параметром является текст вашего сообщения, второй параметр (не обязательный) – заголовок окна сообщения. Третий, также не обязательный параметр, – это комбинация констант, разде­ленных операцией «|» (побитовое «или»). Константы:
MB_ABORTRETRYIGNORE, MB_OK,
MB_OKCANCEL, MB_RETRYCANCEL,
MB_YESNO, MB_YESNOCANCEL
задают комбинации кнопок (по умолчанию – MB_OK – одна кнопка OK).
Другая группа констант:
MB_ICONEXCLAMATION, MB_ICONWARNING,
MB_ICONINFORMATION, MB_ICONASTERISK,
MB_ICONQUESTION, MB_ICONSTOP,
MB_ICONERROR, MB_ICONHAND
позволяют добавить значок рядом с текстом инструкция:
MessageBox ("База пуста", "Удаление", MB_OK | MB_ICO-
NERROR);
выведет модальное окно:
сообщения. Например,
Функция MessageBox возвращает целое число, которое в зави­симости от нажатой кнопки соответствует одной из констант:
IDABORT, IDCANCEL, IDIGNORE, IDNO, IDOK, IDRETRY, IDYES.
97
При нажатии кнопки “OK” значение “IDOK”, при нажатии кнопки «Да» - “IDYES” и т.д. Возвращаемое значение можно ис­пользовать для организации ветвления в программе:
if(MessageBox ("нажми кнопочку", "выбор", MB_YESNO |
MB_ICONEXCLAMATION) == IDYES) MessageBox («нажал
ДА»);
else MessageBox("нажал НЕТ");
В кодах, рассматриваемых в предыдущих главах, можно найти большое количество примеров использования окна сообщений. На­пример, в разделе «Файлы» второй главы в тексте функции откры­тия файла можно найти следующий фрагмент, в котором ход выпол­нения программы зависит от выбора, сделанного в диалоге Mes-
sageBox:
int id;
id=MessageBox("Оставить имеющиеся записи", "База не пуста",
MB_YESNOCANCEL | MB_ICONQUESTION);
switch(id){
case IDYES: break; case IDNO: // удаление записей
crew.erase(crew.begin(), crew.end()); iMax = crew.size(); break;
case IDCANCEL: // отказ от чтения из файла
fclose(fp); return;
}
Соответствующий диалог на основе окна сообщений имеет вид:
Диалог TInputDialog
TInputDialog – это диалог, предназначенный для ввода инфор­мации (символьной строки). В предыдущих главах можно также найти большое количество примеров использования этого диалого­вого окна.
98
Рассмотрим еще раз процедуру подключения к проекту соот­ветствующего ресурса. Скопируйте проект, сохраненный в папке «Заготовка». Работать снова будем с копией этого проекта, впрочем, подойдет и любой другой проект. Отредактируйте файл workapp.rc как текст (выберите его в окне проекта → контекстное меню →
View → TextEdit). Добавьте после директивы препроцессора:
#include "workapp.rh"
директиву:
#include <owl/inputdia.rc>
сохраните и закройте файл.
Процедуру подключения к проекту нужного ресурса можно вы­полнить и по-другому. Выберите в контекстном меню редактора ре­сурсов пункт Add to Project…
В появившемся окне выберите тип файла Resourct Script (*.rc) и найдите файл inputdia.rc в папке «…BC5/ include/ owl». Подтвер­дите подключение выбранного ресурса – кнопка «Открыть».
После подключения ресурса к проекту любым из рассмотрен­ных способов его можно найти в редакторе ресурсов в разделе DIALOG → IDD_INPUTDIALOG. Не стоит редактировать этот диалог, так как данный ресурс – общий проектов. Если, например, вы хотите использовать диалог для ввода скрытого пароля и зададите для редактируемого поля диалога IDD_INPUTDIALOG опцию Password, то в любом компилируемом после этого проекте поле ввода окна TInputDialog будет заполняться символом «*».
99
для всех создаваемых вами
Осталось подключить файл с определением необходимых иден­тификаторов. Откройте файл wrkdlgcl.cpp. Добавьте после директи­вы препроцессора:
#include "wrkdlgcl.h"
директиву:
#include <owl/inputdia.h>
Теперь добавьте еще одну кнопку в основной диалог (IDD_CLI­ENT) и в функцию обработчик для этой кнопки введите код:
char buff[32];
wsprintf(buff,"%s","старый текст");
if(TInputDialog(this,"Ваше сообщение", "Введите новое сообще-
ние",
buff,sizeof(buff)). Execute()==IDOK) MessageBox (buff, "но- вый текст");
else MessageBox(buff, "
Запустите проект на исполнение. При нажатии на новую кнопку появляется новое модальное окно:
текст не изменился");
В поле ввода отображается тот текст, который был предвари­тельно записан в массив buff («старый текст»). Если изменить текст и нажать кнопку “ОК”, то новый текст будет скопирован в массив
buff, что и отображается в окне MessageBox. Если выбрана кнопка “Cancel”, то текст, содержащийся в массиве buff, останется неизмен-
ным, независимо от тех символов мое поле.
, которые вы ввели в редактируе-
100
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]