Лабораторная работа № 1
Разработка простейшего диалогового проекта с использованием MFC
Цель работы: изучение технологии разработки диалогового проекта с использованием библиотеки MFC, структуры проекта, порядка задания свойств и программирования элементов управления
Задание
1. Изучите раздел "Учебная информация" и реализуйте описанный в нем пример проекта. Опишите своими словами смысл выполняемых в проекте действий.
2. В соответствии с вариантом задания, содержащемся в файле Var01.doc, реализовать диалоговый MFC-проект под именем DlgXX, где XX – номер варианта. Под каждую вводимую и выводимую величину организовать отдельное поле. Надписи к полям должны соответствовать смыслу задачи. Выполнение решения задачи – по нажатию на кнопку.
3. Подготовьте отчет о работе. В раздел "Выполнение" включите ответы на контрольные вопросы и вид полученного диалогового окна.
Учебная информация
Создадим диалоговый MFC-проект, выполняющий возведение в квадрат вещественного числа. В отличие от консольного приложения, в котором диалог с пользователем ведется через текстовое окно, в создаваемом приложении основой для обмена информации с пользователем является специальное диалоговое окно, в котором можно размещать различные элементы управления работой проекта: кнопки, поля, надписи, рисунки и т.д.
1. Выберем тип проекта – MFC AppWizard (exe), зададим имя проекта – Dialog1 и на первом шаге Мастера установим переключатель Dialog based. Остальные настройки Мастера оставим без изменения. В результате получим окно интегрированной среды, показанное на рисунке 1.
Рис. 1.
Следует обратить внимание, что в области интегрированной среды, где в консольном приложении располагался редактор кода, теперь находится диалоговое окно, а в верхней части добавлена панель элементов управления. Диалоговое окно содержит две кнопки и надпись. Если откомпилировать проект, то щечок мыши на любой из них будет приводить к закрытию окна, т.е. проект работает, но, пока не выполняет поставленной задачи.
Следует также заметить, что Мастер создал достаточно большой код проекта, содержащий три класса: CAboutDlg – класс окна "О программе"; CDialog1App – класс самого приложения и класс CDialog1Dlg – класс диалогового окна. На рисунке в окне управления проектом видно, что класс CDialog1Dlg содержит шесть функций различного назначения.
2. Удалим три элемента управления на диалоговом окне. Установим свои элементы управления: одну кнопку, два текстовых поля и две надписи как показано на рис. 2. Будем считать, что исходное число вводится в верхнее поле, а результат выводится в нижнее после нажатия кнопки "Пуск".
Для установки следует щелкнуть по соответствующему элементу на панели и "растянуть" его мышью в диалоговом окне. Тексты на кнопке и в элементах "Надпись" вводятся через окна свойств этих элементов. Для вызова этого окна необходимо щелкнуть правой кнопкой мыши по элементу и в контекстном меню выбрать Properties.
Прежде, чем вводить надписи русским текстом, необходимо выполнить следующие настройки:
-
обратиться к меню Project/Settings и на вкладке Resources установить язык – Russian;
-
в окне управления проектом щелкнуть правой кнопкой мыши по имени ресурса (диалогового окна) – IDD_DIALOG1_DIALOG, открыть окно свойств этого ресурса и в поле Language установить Russian.
В поле Caption окон свойств элементов управления введем надписи в соответствии с рис. 2. Размер и тип шрифта можно изменить в окне свойств диалогового окна (кнопка Font...).
3. Для хранения значений, вводимых и выводимых в текстовые поля, следует ввести соответствующие переменные – компоненты класса CDialog1Dlg. Для этого выполним View/ClassWizard и выберем вкладку Member Variables. Здесь в списке Control IDs выберем идентификатор первого поля – IDC_EDIT1 и нажмем кнопку Add Variable. В окне Add Member Variable в поле Member Variable Name зададим имя переменной – m_edit1, в поле Category выберем Value, а в поле Variable Type – тип double и нажмем Ok. Аналогично создадим переменную m_edit2 для второго текстового поля.
4. Основным командным элементом диалогового окна является кнопка "Пуск". Для программирования ее работы в окне ClassWizard следует открыть вкладку Message Maps, выбрать в поле Class Name имя CDialog1Dlg, в поле Object ID (идентификатор объекта) – IDC_BUTTON1, а в поле Messages (сообщения) – BN_CLICKED. После этого надо нажать кнопку Add Function (добавить функцию) и в открывшемся окне оставить имя функции – обработчика нажатия кнопки "Пуск" без изменения – OnButton1. В окне ClassWizard нажать кнопку Edit Code (редактировать код), после чего будет открыт редактор кода на заготовке вставленной функции. Место вставки кода обработки события нажатия кнопки "Пуск" обозначено комментарием:
//TODO: Add your control notification handler code here.
Этот комментарий можно удалить, а на его место вписать следующий код:
UpdateData(TRUE);
m_edit2=m_edit1*m_edit1;
UpdateData(FALSE);
5. Откомпилируем и запустим проект. Пример решения задачи показан на рис. 3.
Проанализируем состав файлов в папке проекта. В первую очередь, обратим внимание на наличие трех пар файлов: Dialog1.cpp и Dialog1.h; Dialog1Dlg.cpp и Dialog1Dlg.h; StdAfx.cpp и StdAfx.h. Первая пара описывает созданное приложение, вторая – диалоговое окно, третья подключает стандартные системные библиотеки.
C++ является объектно-ориентированным языком. Основным инструментом для реализации объектов являются классы. В С++ принят стиль записи программ, в котором общее описание класса содержится в заголовочном файле, а описание функций класса – в файле реализации, имеющем расширение .cpp. Таким образом выполняется поддержка принципа инкапсуляции и защита авторских прав программиста: пользователю передаются заголовочные файлы с прототипами функций класса и откомпилированные файлы проекта. Пользователь знает как использовать функции и компоненты данных класса, однако тексты функций класса, содержащиеся в файлах реализации типа .cpp могут остаться у автора.
Следует обратить внимание, что двойной щелчок по имени класса в окне управления проектом (рис. 1) приводит к открытию в редакторе соответствующего заголовочного файла, а двойной щелчок по имени любой компонентной функции класса – к открытию файла реализации .cpp.
Существенно автоматизировать добавление в проект новых классов, компонент данных и компонент–функций класса помогает Мастер ClassWizard. В рассмотренном примере в класс CDialog1Dlg добавлена функция – обработчик события нажатия на кнопку "Пуск" OnButton1(). Информация об этой функции автоматически добавляется Мастером ClassWizard в следующие области описания класса:
-
в заголовочный файл Dialog1Dlg.h добавлен прототип функции afx_msg void OnButton1();
-
в карту сообщений файла реализации Dialog1Dlg.cpp добавлена макрокоманда, связывающая между собой идентификатор кнопки IDC_BUTTON1 с функцией – обработчиком события: ON_BN_CLICKED(IDC_BUTTON1, OnButton1);
-
в конец файла Dialog1Dlg.cpp добавлена заготовка фукции – обработчика void CDialog1Dlg::OnButton1(){ }.
Следует заметить, что для добавления простых функций, не являющихся обработчиком какого-либо события, используется контекстное меню Add Member Function..., вызываемое щелчком правой кнопки мыши по имени класса в окне управления проектом. При этом в карту сообщений ничего не добавляется.
Контрольные вопросы
1. Что такое мастер ClassWizard?
2. Какие действия выполнены при разработке приложения с помощью мастера ClassWizard?
3. Что такое идентификатор объекта?
4. Как запрограммировать запуск решения задачи щелчком правой кнопке мыши по клиентской области окна?
5. Для чего в класс диалогового окна введены компоненты данных, связанные с текстовыми полями?