Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Разработка Windows - приложений в среде Borland. Учебное пособие
.pdf
строит прямоугольник, заданный координатами левого верхнего угла и правого нижнего угла.
После построения сектора или прямоугольника выводится легенда диаграммы, поясняющая используемые при построении обозначения. Прямоугольник, определеный точками pointRB и pointLT
отображает тип заливки, выбранной для должности, название которой выводится уже известной функцией TextOut.
Осталось в конец метода
float sg=0, ss=0, sc=0, sum=SumPay(crew); // sum – сумма всех ок-
if(sum!=0) {
sg=SumPay(crew, "сторож")/sum; // приведенные значения
ss=SumPay(crew, "сантехник")/sum; // приведенные значения
sc=SumPay(crew, "дворник")/sum; // приведенные значения
}
TBrush tbr(TColor::LtGreen); // сплошная зеленая
TBrush tbr_cr(TColor::LtRed,HS_CROSS); // штриховка решет-
TBrush tbr_dcr(TColor::LtBlue,HS_DIAGCROSS); // диагональ-
TPen pen(TColor::Black,2); // перо толщиной два
TRect r=GetClientRect(); // получим размеры
r.top = r.top+r.bottom/2; // рисовать будем в
TPoint pointLT(r.right*0.7,r.top-20); // верхний угол первой
TPoint pointB(r.right*0.5-30,r.bottom); // нижний угол первой
dc.SetBkColor(TColor::Sys3dFace); // устанавливаем фон
EvPaint добавить инструкции:
ладов
кисть
кой
ная решетка
пикселя
клиентской области окна
нижней половине
легенды
гистограммы
под текстом легенды
121

// далее рисуем три прямоугольника или сектора в зависимости от
типа диаграммы:
ShowDiagram( dc, tbr_cr, r, pointB, pointLT, ss, 0, "сантехники");
ShowDiagram( dc, tbr, r, pointB, pointLT, sc, 360.0*ss,
"дворники");
ShowDiagram( dc, tbr_dcr, r, pointB, pointLT, sg, 360.0*(ss+sc),
"охрана");
dc.RestoreObjects(); // восстанавливаем исходные
инструменты контекста
Запустите программу, заполните базу данными на сотрудников
и нажмите кнопку «Статистика». Появится модальное окно, в верхней половине окна итоговые данные отобразятся в табличном виде,
а в нижней половине
окна будет построена круговая диаграмма:
122

Выберите переключатель «Гистограмма» и посмотрите на результат:
Обмен данными. Буфер обмена (передачи)
В предыдущем разделе дополнительный диалог использовался
для обработки и вывода информации. При этом новых данных в
программу из диалога не поступало. Обсудим теперь возможность
использования дополнительных диалогов для ввода данных и процедуру обмена данными между диалогом и основным приложением.
Добавим в проект еще один диалог, созданный на основе нового
класса
. Вызовите ClassExpert (меню View → ClassExpert) и в контекстном меню панели Classes команду “Add new class”. В появившемся окне “Add new class” выберите в качестве базового класса TDialog
и задайте в поле “Class name” имя нашего нового класса, например
TDiaInput. Обязательно задайте идентификатор создаваемого ресурса в поле “Resource Id” – IDD_INPUT. Подтвердите создание
класса – кнопка “OK”. Появится окно выбора параметров нового
диалога. Как и
ранее, можно ничего не менять.
Нажмите кнопку “OK”. Будет создан новый диалог и в проект
добавлены модули нового класса diainput.cpp и diainput.h. Найдите
в редакторе ресурсов созданный диалог IDD_INPUT и отредактируйте его. В окне свойств диалога задайте заголовок диалога «Ввод»
123

и снимите флажок “Context Help” на вкладке “Extended”. Удалите
кнопку “Help”.
Отредактируйте основной диалог – IDD_CLIENT. Добавьте
кнопку «Ввод» и создайте функцию-обработчик нажатия на эту
кнопку – BNClickedInput. Введите в созданную функцию код:
TDiaInput(this, IDD_INPUT).Execute();
или просто
TDiaInput (this).Execute();
и добавьте в заголовочный файл основного диалога (wrkdlgcl.h) директиву:
#include "diainput.h
Запустите программу на исполнение и проверьте, отображается
ли новый диалог после нажатия на эту кнопку «Ввод». Если все в
порядке, то вернитесь к редактированию нового диалога IDD_IN-
PUT.
В левой стороне окна разместите вертикально две надписи
(элемент управления “А” – Static Text) и задайте в окне свойств нужный текст – «должность» и «имя». Добавьте справа
от надписи
«должность» комбинированный список (элемент управления Combo-
Box), задайте в его окне свойств на вкладке «ComboBox» нужный тип
– “Dropdown List” и снимите флажок “Sort”. Справа от надписи
«имя» поместите редактируемое поле (элемент управления “ab|” –
Text Edit) и очистите свойство “Caption”.
Под надписями поместите группу из трех переключателей (эле-
мент управления Radio Button) для задания пола сотрудника
(«муж-
ской», «женский» и «современный»):
124

Вспомните, что порядок создания переключателей должен быть
последовательным, один за другим непосредственно. Проверьте:
меню Dialog → Set Creation Order. Если все правильно, нажмите
клавишу “Esc”. Установите свойство “Group Flag” у первого переключателя («мужской»), у остальных переключателей группы данное свойство должно быть отключено.
Далее создайте необходимые объектные переменные: присвойте
через Class Expert имена элементам управления. Комбинированному
списку присвойте имя
EditNameInput, а переключателям – RadioMaleInput, RadioFemaleInput и RadioModernInput соответственно. Сохраните все и
попробуйте запустить проект.
Замечание: Иногда Class Expert не справляется с обилием идентификаторов и программа «вылетает». Чаще всего это вызвано тем,
что различным идентификаторам присвоены (в модуле workapp.rh)
одинаковые числовые значения. Исправить такую ситуацию несложно, можно
сов workapp.rh и изменить значения идентификаторов. Числа могут
быть любыми, главное – не повторяющимися. Строго говоря, одинаковые числовые значения не всегда приводят к ошибкам, но такая
рекомендация, как мне кажется, понятнее. Гораздо реже в результате
сбоя, вызванного, как правило, многократным добавлением и удалением элементов, возникают
различных элементов управления. В этом случае придется изменить
эти имена в окне свойств соответствующих элементов или «вручную» отредактировать модули проекта. Будем надеяться, что вы
счастливо избежали подобного сбоя или сумели исправить ситуацию.
Теперь разберемся с процессом обмена данными. В каждом
классе диалога, в начале соответствующего
можно найти буфер обмена. В нашем случае, в файле diainput.h он
будет описан следующим образом:
struct TDiaInputXfer {
//{{TDiaInputXFER_DATA}}
TComboBoxData ComboJobInput;
char EditNameInput[ 255 ];
uint RadioMaleInput;
просто отредактировать заголовочный файл ресур-
ComboJobInput. Редактируемому полю имя
одинаковые имена идентификаторов у
заголовочного файла,
125

uint RadioFemaleInput;
uint RadioModernInput;
//{{TDiaInputXFER_DATA_END}}
};
а в файле diainput.cpp будет объявлена соответствующая структурная переменная:
static TDiaInputXfer TDiaInputData;
Устанавливается буфер передачи в конструкторе класса диалога:
SetTransferBuffer(&TDiaInputData);
При загрузке диалога в элементы управления выводятся значения, хранящиеся в соответствующих полях буфера обмена. В случае
выхода из диалога после нажатия пользователем кнопки “OK” в полях структуры запоминаются значения
соответствующих элементах управления. Если диалог закрыт с помощью кнопки “Cancel”, измененные значения игнорируются.
Все было бы хорошо, но структурная переменная TDiaInput-
Data определена непосредственно в модуле diainput.cpp, а нам она
потребуется и в основном диалоге, в модуле wrkdlgcl.cpp. Поэтому
сделаем ее глобальной. Для этого в файле diainput.cpp уберите
ключевое
а в заголовочном файле diainput.h сразу за приведенным выше определением структуры TDiaInputXfer поместите объявление:
(unsigned int) у буферов переключателей на тип WORD. Здесь
должно быть двухбайтовое целое, а не четырехбайтовое. Если не
изменить, то два последних переключателя будут неправильно опознаваться в
в заголовочном файле “windef.h”.
слово static:
TDiaInputXfer TDiaInputData;
extern TDiaInputXfer TDiaInputData;
Следующий важный момент – замените в структуре типы uint
буфере обмена. Типы данных uint и WORD определены
, измененные пользователем в
126

Закончим редактирование диалога «Ввод». Вызовите Class Ex-
pert, выберите класс нового диалога TDiaInput, раскройте список
виртуальных функций и перегрузите метод SetupWindow класса
TDiaInput. В созданную заготовку функции добавьте инструкции
для заполнения списка и выбора начальной установки в группе переключателей (пол – «современный»):
ComboJobInput -> AddString("дворник");
ComboJobInput -> AddString("сантехник");
ComboJobInput -> AddString("сторож");
ComboJobInput -> SetSelIndex(0);
CheckRadioButton(104, 106, 106); // установка по значе-
нию идентификатора
Вместо строчки:
CheckRadioButton(104, 106,106);
можно, как и ранее, написать инструкцию с использованием имен
идентификаторов группы переключателей (диапазон с IDC_RADIO-
BUTTON3 по IDC_RADIOBUTTON5, выбран IDC_RADIOBUTTON5):
CheckRadioButton(IDC_RADIOBUTTON3,
IDC_RADIOBUTTON5, IDC_RADIOBUTTON5);
И наконец отредактируйте модуль основного диалога – файл
wrkdlgcl.cpp. Найдите уже созданную нами ранее функцию-обработчик нажатия на кнопку «Ввод» – BNClickedInput и после строчки:
TDiaInput(this).Execute();
добавьте инструкции:
char buff[256];
wsprintf(buff,"должность - %s\nимя - %s\n",
127

TDiaInputData.ComboJobInput.GetSelection().c_str(),
TDiaInputData.EditNameInput);
if(TDiaInputData.RadioMaleInput == BF_CHECKED){
strcat(buff, "пол - муж");
}
if(TDiaInputData.RadioFemaleInput == BF_CHECKED){
strcat(buff, "пол - жен");
}
if(TDiaInputData.RadioModernInput == BF_CHECKED){
strcat(buff, "пол - средний");
}
MessageBox( buff, "Считано");
Как уже говорилось, поля буфера передачи TDiaInputData содержат значения, выбранные пользователем в диалоге «Ввод» (если
была нажата кнопка «OK»). Имена полей соотвествуют именам, заданным элементам управления диалога. Поэтому поле TDiaInput-
Data.ComboJobInput соответствует состоянию комбинированного
списка. Метод GetSelection возвращает
списка. Поскольку это значение типа string (не верьте встроенной
справке Borland – это не char*), приходится преобразовывать его в
char* с помощью метода c_str класса string. Значением поля EditNameInput является строка символов, введенная в это поле. Значе-
нием полей радиокнопок (RadioMaleInput и др.) будет константа
BF_CHECKED, если соответствующий переключатель
пользователем. Таким образом, полученные из диалога «Ввод» значения можно использовать в нашем основном диалоге, например,
для организации расширенного поиска в базе данных. В приведенном примере они просто выводятся в окно сообщений MessageBox.
Конечно, в нашей базе данных не было поля «пол сотрудника».
Группа переключателей была введена только для иллюстрации
редачи выбранного в такой группе значения. Запустите программу и
нажмите кнопку «Ввод», выберите желаемые установки.
Выйдите из диалога «Ввод», нажав кнопку “OK”. Выбранные
значения сохранились в буфере обмена и доступны в основном диалоге:
значение выбранной строки
выбран
пе-
128

129

ГЛАВА IV. ЭЛЕМЕНТЫ УПРАВЛЕНИЯ
Визуальная среда редактора ресурсов Borland предоставляет
разработчику широкий выбор элементов управления. Наиболее распространенные элементы расположены на вкладке «Standard» – это
командные кнопки, надписи (метки), редактируемые поля, списки,
флажки и переключатели:
Неподписанные объекты вкладки “Standard” собственно не являются элементами управления, не имеют списка сообщений и
предназначены для декоративного оформления диалога. При этом
линии и рамка это, на самом деле, один и тот же элемент Frame
(рамка). Принципы работы с большинством объектов, расположенных на вкладке “Standard”, уже обсуждались в предыдущих главах.
Поэтому
основном конспективно, за исключением вопросов, не рассматривавшихся ранее. Далее в этой главе дополнительно рассматриваются
некоторые из элементов управления, расположенных на вкладке
«Common».
друга, как по функциональному назначению, так и по внешнему виду, они имеют ряд общих характеристик, часть которых можно просмотреть и изменить на вкладе “General” модального окна свойств
элемента – Properties. Для этого дважды щелкните мышкой по нужному элементу или выберите
меню элемента:
в этой главе соответствующая информация приводится в
О
БЩИЕ ХАРАКТЕРИСТИКИ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
Несмотря на то, что элементы управления отличаются друг от
соответствующий пункт контекстного
130
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
