Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Разработка Windows - приложений в среде Borland. Учебное пособие
.pdf
ния 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. Это, например, диалоги открытия и сохранения
файлов, печати, выбора шрифта, цвета и т.п. Кроме того, можно использовать и уже знакомые нам диалоговые окна сообщений – MessageBox и окна ввода – TInputDialog. Рассмотрим подробнее возможности, предоставляемые нам встроенными диалогами MessageBox и 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_CLIENT) и в функцию обработчик для этой кнопки введите код:
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
