Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Организация вывода диалогового окна на экран.




Задание идентификаторов диалогового окна и элементов управления.

Поскольку каждое диалоговое окно в приложении является уникальным объектом, разработчику практически всегда нужно присваивать окнам и элементам управления, входящим в их состав, идентификаторы по собственному выбору. Конечно, можно согласиться и с теми идентификаторами, которые предлагает редактор диалоговых окон по умолчанию. Они не несут смысловой нагрузки (как правило, нечто вроде IDD_DIALOG1, IDC_EDIT1, IDC_RADI01) и их можно заменить другими, связанными с назначением и функциями окна или элемента. Но в любом случае рекомендуется соблюдать соглашение о префиксах: идентификаторы диалоговых окон имеют префикс IDD_, а идентификаторы элементов управления – IDC_. Заменить идентификатор можно с помощью диалогового окна Dialog Properties. Для этого выберите элемент управления или диалог и Edit Properties, если ранее окно Dialog Properties не было выведено и закреплено на экране. Затем измените идентификатор ресурса в поле ID, но при этом не забывайте о префиксах: IDD_– для диалоговых окон и IDC_ – для элементов управления.

Создание диалогового окна Dialog

Установите элементы управления на поверхности диалога. Для этого щелкните мышью на пиктограмме соответствующего элемента управления, а затем щелкните на форме в том месте, где будет расположен этот элемент. Если посчитаете нужным, "ухватитесь" указателем мыши за один из размерных маркеров вокруг изображения элемента. С помощью его передвижения можно изменять границы размеров элемента.

Добавьте элемент типа флажок и три переключателя в диалоговое окно, чтобы оно приняло вид, изображенный на рис. 3.1. В поле Caption измените надписи для переключателей. Пусть это будут One (один), Two (два) и Three (три). Чтобы выровнять включенные в окно элементы (выстроить их в колонку), выберите один из них, а затем, нажав и удерживая клавишу <Ctrl>, выберите по очереди остальные. После этого выберите в меню Lay-Out\Align Control Left, затем выберите команду Lay-Out\Space Evenly\Down (Размещение\Подравнять интервал\Вниз). Эта команда позволяет установить одинаковый интервал между элементами по вертикали.

Выберите переключатель One, вызовите окно Dialog Properties и установите в нем флажок Group (Группа). Такая установка означает, что переключатель One является первым элементом группы переключателей, т.е. именно к переключателям, объединенным в группу, будет в дальнейшем применяться принцип «только один прав».

Теперь добавьте в формируемое окно еще и элемент типа список. Установите его слева от переключателей и измените размеры. В то время, когда этот элемент еще остается выбранным, с помощью команды View=> Properties вызовите на экран окно Dialog Properties. Выберите вкладку Styles (Стили) и проверьте, не установлен ли флажок Sort (Сортировка). Если этот флажок установлен, то при выполнении программы элементы в списке будут отсортированы по алфавиту.

Создание класса диалогового окна.

Когда формирование ресурсов диалогового окна будет завершено, вызовите на экран диалоговое окно мастера ClassWizard. Для этого нужно выбрать View\ClassWizard. Мастер ClassWizard обнаружит новый диалог и предложит создать новый класс, как это показано на рис. 2.4. Установите переключатель Create a new class (создать новый класс) и щелкните на ОК. Появится новое диалоговое окно New Class (новый класс), которое показано на рис.2.5. В поле Name (имя) введите имя нового класса (например, CSDIDialog) и щелкните на ОК. После этого ClassWizard создаст новый класс, подготовит файл текста программы SDIDialog.cpp и файл заголовка SDIDialog.h и включит их в состав проекта.

Создание ассоциированных переменных.

Ассоциированная переменная позволяет установить связь между текстом программы и ресурсами окна.

Ассоциированная переменная класса диалогового окна задается в ClassWizard на закладке Member Variables (рис.3.2) и соответствует либо значению - содержимому элемента управления, либо объекту класса соответствующего данному типу элемента управления. Пример, представленный на рис. 3.3, демонстрирует один из вариантов ассоциативной связи. Элементу IDC_CHECK1 следует присвоить идентификатор переменной m_check. Нужно проверить, чтобы в раскрывающемся списке Category (Категория) было выбрано Value (Значение). Если вы раскроете список Variable type (Тип переменной), то увидите, что вам предоставлен единственный "свободный" выбор – BOOL. Флажок может быть либо установлен, либо сброшен, а значит, ассоциирован только с переменной типа BOOL, которая принимает только два значения – TRUE и FALSE. Нажмите на ОК для завершения процедуры.

Ниже перечислены типы переменных, которые могут быть ассоциированы с тем или иным типом элемента управления:

текстовые поля – как правило, строковый тип(CString), но иногда и другие – int, fIoat и Iong;

кнопки – int;

флажки – BOOL;

переключатели – int; 

список – строковый тип;

поле со списком – строковый тип;

полоса прокрутки – int .

Свяжите таким же образом значение, которое содержится в элементе IDC_EDIT1, с членом-переменной m_edit типа CString. Элемент IDC_LIST1 должен быть связан с членом-переменной m_list, который должен быть объектом класса CListBox (в списке Category должно быть избрано Control). Первый переключатель в группе IDC_RADIO1 должен быть связан с членом-переменной m_radio типа int, причем связь должна быть установлена по значению.

После добавления переменных ClassWizard предложит установить параметры, которые могут быть использованы для проверки достоверности ввода данных. Это делается не для всех видов переменных. Но, например, если речь идет о переменной, связанной с текстовым полем, СlassWizard предлагает в поле Maximum Characters (Максимум символов) установить максимальную длину вводимой строки (рис.3.4.). Для члена-переменной m_edit установите значение этого параметра равным 10. Если текстовое поле ассоциировано с переменной типа int или float, ClassWIzard использует эту же часть окна для установки верхнего и нижнего пределов вводимого пользователем значения. В дальнейшем всю работу по проверке соответствия введенного значения установленным ограничениям и выдачу в случае их нарушения сообщения с просьбой повторить ввод берут на себя функции из библиотеки MFC.

 

 

4. Организация вывода диалогового окна на экран. Функция обмена данными между элементами управления и ассоциированными переменными. Иерархия вызовов функций при организации модального диалога.

Использование класса диалогового окна

Теперь, когда сформирован ресурс и подготовлен класс окна, можно создавать объект этого класса в программе (методе InitInstance) и выводить на экран связанное с ним диалоговое окно. Выведем диалоговое окно сразу после запуска приложения. Для этого используется функция DoModal().

Организация вывода диалогового окна на экран.

Выберите вкладку ClassView в рабочей зоне проекта, раскройте пункт SDI Classes, а в нем – CSDIApp. Дважды щелкните на функции-члене InitInstance(). Эта функция вызывается при любом запуске приложения. Перейдите в самое начало файла и после уже имеющихся директив # inсlude вставьте еще одну:

#include "sdidialog.h"

Теперь при трансляции компилятор будет знать, где взять информацию о классе CSDIDialog. Перейдите в конец текста функции CSDIApp::Initlnstance() в файле SDI.CPP и добавьте перед окончанием текста функции следующие строки:


CSDIDialog dlg;

dlg.m_check = TRUE;

dlg.m_edit = "hi there";

CString msg;

if (dlg.DoModal() == IDOK) {

msg = "You сIicked OK. ";}


Else

{

msg = "You clicked Cancel. ";

}

msg += "Edit Box is: ";

msg += dlg.m_edit;

AfxMessageBox(msg);


Приведенный выше фрагмент программы создает экземпляр класса диалогового окна. Он устанавливает параметры по умолчанию для двух элементов управления – флажка и текстового поля. Сам по себе вывод диалогового окна производится функцией DoModal(), которая возвращает числовое значение – IDOK, если пользователь вышел из окна, нажав на ОК, и IDCANCEL, если выход произошел после нажатия на Cancel. Затем в приведенном фрагменте формируется сообщение, которое выводится на экран функцией AfxMessageBox().

Запуск и компиляция приложения.Запустите процесс компиляции и компоновки проекта, выбрав команду Build=>Build или щелкнув на пиктограмме Build (Построить) панели инструментов Build. Запустите выполнение приложения, воспользовавшись командой Build\Execute (Построить\Выполнить) или щелкнув на пиктограмме Execute (Выполнить) панели инструментов Build. Вы увидите, что на экране появилось диалоговое окно с параметрами элементов управления, установленными по умолчанию в программе, которую вы только что отредактировали.

После загрузки созданного вами приложения поменяйте что-либо в текстовом поле (например, введите текст hello), а затем щелкните на ОК. После этого на экране должно появиться окно сообщения.

Снова запустите приложение, отредактируйте текст в поле и выйдите из окна, щелкнув на Cancel. Обратите внимание на сообщение, гласящее, что в поле остался исходный текст hello. Это получилось потому, что MFC не дублирует содержимое текстового поля (как элемента управления) в переменную-член в случае, если пользователь щелкает на Cancel для выхода из окна. И снова, как и в предыдущем эксперименте, закройте приложение.

После того, как вы щелкнете на ОК, приложение выведет в окне сообщения копию текста, введенного в текстовом поле. Надпись в окне гла­ит: В”You clicked OK. Edit Box Is: hello”.

Если вы щелкнете на Cancel, приложение проигнорирует любые изменения элементов управления. Надпись в окне гласит: “You clicked Cancel. Edit Box Is: hello”.

Как это происходит? Когда вы щелкнули на OK, MFC организовал вызов функции OnOK(). Функция OnOK() унаследована от базового класса CDialog, классом-наследником которого является наш диалог. Помимо прочего в нем находится функция DoDataExchange(), подготовленная средствами СlassWizard. Вот как она выглядит в настоящий момент:

void CSDIDialog::DoDataExchange(CDataExchange* pDX)

{CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CSdiDiaIog)

DDX_Control(pDX, IDC_LIST1, m_list);

     DDX_Check(pDX, IDC_CHECK1, m_check);

     DDX_Text(pDX, IDC_EDIT1, m_edit);

     DDV_MaxChars(pDX, m_edit, 10);

     DDX_Radio(pDX, IDC_RADI01, m_radio);

     //}}AFX_DATA_MAP }

Все функции, имена которых начинаются с DDX, выполняют обмен данными. Первым аргументом является указатель на объект класса CDataExchange, этот объект определяет параметры обмена, в том числе направление, в котором надо выполнить обмен данными. Вторым аргументом каждой функции является идентификатор элемента управления, а третьим – переменная класса. Именно таким образом СlassWizard устанавливает соответствие между элементами управления и членами класса диалогового окна – это СlassWizard подготовил такой текст программы вместо вас. СlassWizard также включил имена членов-переменных в файл заголовка, в котором объявляется структура класса.

Имеются 34 функции, их имена начинаются с DDX – одна на каждый тип данных, которыми могут обмениваться диалоговое окно и соответствующий класс. Каждая функция включает в свое имя также имя элемента управления. Например, функция DDX_Check() используется для связи между элементом типа флажок (check box) и членом-переменной типа BOOL. Аналогично DDX_Text() используется для связи члена-переменной типа CString с текстовым полем. СlassWizard выбирает соответствующую функцию в процессе выполнения описанной выше операции связывания членов класса с элементами управления. Существует несколько DDX-функций, за которые ClassWizard не несет ответственности. Например, если вы связываете список по значению с переменной, то единственным выбором для вас является тип CString. В этом случае ClassWizard формирует функцию DDX_LBString(), которая связывает выбранный в списке элемент с членом-переменной типа CString. Однако иногда эффективнее использовать индекс выбранного элемента, а не сам элемент. Для этого случая имеется функция DDX_LBIndex(), которая выполняет соответствующий обмен. Вызов этой функции можно добавить в текст функции-члена DoDataExchange. Соответствующая строка может быть вставлена в том месте программы, где имеется специальный комментарий, созданный ClassWizard. При этом не забудьте добавить соответствующую переменную-член в объявление класса в файле заголовка. Полный список DDX-функций можно найти в электронной документации.

Функции, имена которых начинаются с DDV, ответственны за проверку соблюдения заданных ограничений на вводимые данные. ClassWizard вставляет вызов DDV_MaxChars() сразу за вызовом DDX_Text, которая передает содержимое текстового поля IDC_EDIT1 в переменную m_edit. Второй аргумент вызова функции – идентификатор переменной-члена, а третий – значение параметра, ограничивающего длину вводимой строки. Если пользователь когда-нибудь при работе с программой попытается ввести символов больше, чем дозволено, то DDV_MaxChars() организует вывод на экран предупреждающего сообщения. Так что вы можете только указать величину ограничения и рассчитывать, что все дальнейшее будет организовано СlassWizard и MFC.

Приложение не должно напрямую вызывать метод DoDataExhange. Он вызывается через метод UpdateData, определенный в классе CWnd. Необязательный параметр этой функции определяет, как будет происходить обмен данными.

Если метод UpdateData вызывается с параметром FALSE, то выполняется инициализация диалоговой панели. Информация из данных класса отображается в органах управления диалоговой панели.

В случае если метод UpdateData вызван с параметром TRUE, данные перемещаются в обратном направлении. Из органов управления диалоговой панели они копируются в соответствующие элементы данных класса диалоговой панели.

Метод UpdateData возвращает ненулевое значение, если обмен данными прошел успешно, и нуль в противном случае. Ошибка при обмене данными может произойти, если данные копируются из диалоговой панели в элементы класса диалоговой панели и пользователь ввел неправильные данные, отвергнутые процедурой автоматической проверки данных.

При создании модальной диалоговой панели перед тем, как панель появится на экране, вызывается виртуальный метод OnInitDialog класса CDialog. По умолчанию OnInitDialog вызывает метод UpdateData и выполняет инициализацию органов управления.

Если метод OnInitDialog переопределяется в классе диалоговой панели, в первую очередь необходимо вызвать метод OnInitDialog класса CDialog.

Метод UpdateData также вызывается некоторыми другими методами класса CDialog. Так, метод UpdateData вызывается, когда пользователь закрывает модальную диалоговую панель, нажимает кнопку "Ok".

Заметим, что кнопка "Ok" должна иметь идентификатор IDOK. Если пользователь нажмет на кнопку "Cancel", имеющую идентификатор IDCANCEL, то диалоговая панель также закрывается, но метод UpdateData не вызывается и обмен данными не происходит.

Методу DoDataExchange, который служит для реализации механизмов автоматического обмена данными, передается указатель pDX на объект класса CDataExchange. Этот объект создается, когда инициируется процесс обмена данными вызовом функции UpdateData.

Элементы данных класса CDataExchange определяют процедуру обмена данными, в том числе определяют, в каком направлении будет происходить этот обмен. Следует обратить внимание на то, что указатель pDX передается функциям DDX_ и DDV_.

Замечание. Если к диалоговой панели добавить новые органы управления и связать их средствами ClassWizard с элементами данных класса CDlg, то в блоке AFX_DATA_MAP будут размещены вызовы и других функций DDX и DDV, необходимые для выполнения обмена данными.

 

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 258.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...