Одна из главных целей операционной системы Microsoft Windows – дать человеку, который хотя бы немного знаком с системой, возможность сесть за компьютер и запустить любое приложение без предварительной подготовки



Pdf просмотр
страница5/7
Дата28.11.2016
Размер0.9 Mb.
Просмотров1566
Скачиваний0
1   2   3   4   5   6   7
3.15. Задачи на самостоятельную работу
1.
Создайте программу, содержащую таймер, который по двойному щелчку мыши меняет отсчет времени с обычного на остаток до ново- го года, т. е. показывает, сколько времени осталось до ближайшего нового года (задача простой сложности – программа описана в лите- ратуре).
2.
Создайте приложение – окно, меняющее форму в зависимости от то- го, находится ли мышь на окне или вне окна (задача средней сложно- сти – различные части программы описаны в литературе).
3.
Создайте программу – окно с дополнительной кнопкой возле кнопки
«Свернуть окно», выполняющее какое-либо действие (задача сред- ней сложности – различные части программы описаны в литературе).
4.
Создайте программу – музыкальный синтезатор. На 7–15 клавиш клавиатуры устанавливается обработчик сообщений, который выдает звук из системного динамика компьютера разной длины и частоты в зависимости от нажатой клавиши (задача средней сложности – раз- личные части программы описаны в литературе).
5.
Создайте программу, которая обрабатывает нажатие на кнопки
«Свернуть окно», «Развернуть окно» по-другому. На кнопку «Свер- нуть окно» программа разворачивает окно, на кнопку «Развернуть окно» программа сворачивает окно (задача повышенной сложности – различные части программы опубликованы в Интернете).
3.16. Методика проведения лабораторной работы № 2
Лабораторная работа № 2 проводится на трёх занятиях. Перед её началом студенты должны ознакомиться с текстом лабораторной работы
(пп. 3.1–3.12).
Занятие № 1 (2 аудиторных часа). Изучение теоретического матери- ала по пп. 3.1–3.12. Подготовка ответов на контрольные вопросы. Вы- полнение заданий №№ 1–3, 5.
Занятие № 2 (2 аудиторных часа). Выполнение заданий № 4 и 6.
Подготовка отчета по п 3.13.
Занятие № 3 (2 аудиторных часа). Выполнение задания № 7 и подго- товка отчета по п. 3.13. Защита отчета по лабораторной работе.
Повышение рейтинговой оценки за лабораторную работу возможно при выполнении одного из задания п. 3.15 во внеаудиторное время.

45
4.

ЛАБОРАТОРНАЯ РАБОТА № 3.
ДИАЛОГОВЫЕ ОКНА
Время выполнения лабораторной работы – 6 часов.
Цель работы – изучить принципы создания диалоговых окон в про- грамме.
Оборудование и программное обеспечение, необходимое для выпол- нения лабораторной работы: компьютер с процессором не хуже Penti- um II с тактовой частотой 266 МГц, оперативной памятью не менее 64
Мб, с операционной системой Microsoft Windows 98/NT/2000/XP, средой программирования Microsoft Visual C++ 6.0.
4.1. Ресурсы
Практически любая программа под Windows имеет меню, диалого- вые окна, пиктограммы и панели инструментов. В Windows эти наиболее распространенные типы объектов определены как ресурсы.
По сути, ресурс – это объект, определенный вне программы, но используемый в ней.
Ресурсы создаются отдельно от программы и добавляются в ЕХЕ- файл на этапе компиляции. Их описание содержится в так называемом
файле ресурсов, который имеет расширение RC. Обычно имя файла ре- сурсов совпадает с именем соответствующего ЕХЕ-файла. Например, ес- ли программа называется PROG.EXE, то файл ресурсов должен назы- ваться PROG.RC. Следует помнить, что с программой может быть связа- но несколько файлов ресурсов.
В зависимости от типа ресурса некоторые из них могут быть описа- ны с помощью текстовых определений. Например, стандартное меню яв- ляется текстовым ресурсом. Текстовые ресурсы обычно полностью опре- деляются в самом файле ресурсов. Другие, такие как пиктограммы, яв- ляются графическими ресурсами и создаются с помощью графических редакторов. Однако они также должны быть указаны в RC-файле про- граммы. Кроме того, можно автоматизировать построение файла ресур- сов с помощью редактора ресурсов, который имеется в Microsoft Visual
C++. Вызов редактора ресурса производится командой «Add Resource…» из меню «Project». В появившемся меню выбирают тип ресурса и нажи- мают кнопку «New».
4.2. Виды диалоговых окон
Обычно Windows-программы взаимодействуют с пользователем при помощи диалоговых окон. Диалоговое окно может просто содержать ка- кое-то сообщение и кнопку OK, а может представлять сложную форму с полями и элементами управления. Диалоговое окно – это настоящее ок-

46
но. Оно имеет размеры, его можно перемещать, сворачивать, закрывать.
Оно принимает и посылает сообщения и даже отрабатывает сообщения о перерисовке изображения в клиентской области.
Существует два типа диалоговых окон. Базовый класс CDialog под- держивает как модальные, так и немодальные диалоговые окна. Пока открыто модальное диалоговое окно (Modal Dialog) (например, Open File
открытие файла), пользователь не может работать ни с какой другой частью программы. Если же открыто немодальное диалоговое окно
(Modeless Dialog), работать с другим окном программы можно. Напри- мер, диалоговое окно «Найти и заменить» Microsoft Word'а совершенно не мешает редактировать текст. Выбор типа окна зависит от характера приложения.
Диалоговое окно отличается от обычного окна Windows тем, что по- чти всегда связано с каким-нибудь ресурсом Windows, идентифицирую- щим элементы и определяющим структуру окна. Поскольку диалоговое окно можно редактировать в редакторе диалоговых окон, то они созда- ются быстро и наглядно.
Диалоговое окно содержит набор элементов управления (Controls).
Windows управляет этими элементами, используя специальную логику группирования и обхода. На элементы управления ссылаются либо по указателю CWnd, так как элементы сами являются окнами, либо по иден- тификаторам определенных #define. Реагируя на действия пользователя, элементы передают сообщения родительскому диалоговому окну.
MFC и ClassWizard, тесно взаимодействуя, облегчают программиро- вание диалоговых окон. ClassWizard генерирует класс, производный от
CDialog, затем соотносит переменные и сообщения с элементами окна.
4.3. Создание диалогового окна в редакторе ресурсов
После добавления ресурса диалоговое окно появляется следующее окно (рис. 4).
Рис. 4. Заготовка для диалогового окна
Добавление элементов на диалоговое окно происходит аналогично с рисованием в векторном редакторе (выбираются соответствующие эле- менты на панели инструментов «Controls» и рисуются на форме). С по-

47
мощью контекстно-зависимого меню, вызываемого правой кнопкой мы- ши, можно установить параметры элемента управления (пункт «Proper-
ties», рис. 5).
Рис. 5. Контекстно-зависимое меню и окно параметров
После того, как окно создано, нужно зарегистрировать его класс и связать с приложением. Для этого используется MFC ClassWizard (меню
«View», команда «ClassWizard»). В нем указывается название класса ок- на, базовый класс, определяются переменные-члены класса и вставляют- ся обработчики сообщений.
Задание № 1. С помощью панели «Controls» (рис. 6) создайте диалоговое окно, изображенное на рис. 6.

Рис. 6. Панель инструментов «Controls» и диалоговое окно

48
4.4. Модальные диалоговые окна
Общая схема создания и вызова модального окна такова:
1)
с помощью редактора диалоговых окон создается окно;
2)
менеджером классов (ClassWizard) определяется новый, производ- ный от CDialog, класс для созданного окна;
3)
определяется событие, после которого окно должно появиться на экране (выбор пункта меню, нажатие кнопкой мыши);
4)
с помощью MFC создается обработчик этого события;
5)
в обработчике создается экземпляр класса окна, вызывается базовая функция CDialog::DoModal();
6)
если необходимо, обрабатываются возвращенные данные.
Рассмотрим это на конкретном примере.
Выбираем из меню «File» команду «New». На вкладке «Projects» вы- бираем из списка пункт «MFC AppWizard». В поле «Project name» вводим название проекта, например «DWindow».
На первом шаге мастера создания приложения выбираем Single Doc- ument. Второй, третий и четвертый проходим без изменений. На пятом шаге мастера определяются базовые классы. Необходимо, чтобы у класса
CDWindowView базовым классом был CView. Завершаем работу мастера нажатием на кнопку «Finish».
В проекте переходим на вкладку «Resources», правой кнопкой щел- каем по пункту «Dialog» и выбираем «Insert Dialog». Будет создано диа- логовое окно с идентификатором IDD_DIALOG1.
Открываем окно менеджера классов (ClassWizard) с помощью меню
«View» командой «ClassWizard». Менеджер классов определит, что диа- логовое окно пока не связано ни с каким классом и предложит две аль- тернативы: создать новый класс («Create A New Class») или выбрать су- ществующий класс («Select an existing class»). Выбираем создание нового класса и вводим имя класса, например CDialogBox, базовым классом ука- зываем CDialog. Нажимаем кнопку «ОК».
Пусть вызов диалогового окна будет осуществляться из пункта ме- ню. Для этого переходим в окне ресурсов на пункт «Menu» и выбираем
«IDR_MAINFRAME», где вставляем пункт «Dialog Box» и присваиваем ему идентификатор IDM_DIALOG.
Затем добавляем обработчик пункта меню. Для этого открываем файл DWindowView.cpp и выбираем команду «ClassWizard» из меню
«View». Выбираем в списке «Object ID» пункт IDM_DIALOG, а в списке
«Messages» – пункт COMMAND и нажимаем кнопку «Add Function». Имя обработчика оставляем без изменений. Нажимаем кнопку «OK».
После переходим к редактированию, где вместо кода
// TODO: Add your command handler code here необходимо ввести следующий код:

49
//
Создание экземпляра класса
CDialogBox с
именем dlg
CDialogBox dlg;
//
Вызов окна
// процесс ждет возврата из окна dlg.DoModal();
Также необходимо вставить в заголовок файла DWindowView.cpp после строк
#include "D_BoxDoc.h"
#include "D_BoxView.h" строку
#include "DialogBox.h"
Возвращаемые данные пока не обрабатываем. Если нужно будет вы- звать диалоговое окно щелчком мыши, в окне «ClassWizard» в списке
«Object ID» указываем «CDWindowView» (т. е. само окно), в списке «Mes-
sages» указываем WM_LBUTTONDOWN и аналогично вносим измене- ния в программный код.
Задание № 2. Сделайте необходимые изменения в проекте, ко- торый был создан в задании № 1, чтобы вызывалось диалоговое окно
(любым способом) по методике, приведенной выше.
4.5. Обмен данными с диалоговым окном
Как Вы могли заметить, элементы управления, располагающиеся на диалоговом окне, никак не реагируют на действия (кроме полей ввода и флажков). Поэтому необходимо рассмотреть общие принципы передачи данных между диалоговым окном и остальной частью программы.
Менеджер классов ClassWizard создает две стандартные функции
DoDataExchange (DDX) и DoDataVerify (DDV). Первая передает данные диалоговому окну, а вторая проверяет их перед возвратом родительскому окну. Нужно сразу заметить, что DDX и DDV хорошо справляются со стандартными типами данных (int, double, char, CString и т. д.), но если использовать собственный тип данных, то придется писать собственную реализацию функций DDV и DDX.
Чтобы DDX и DDV начали передавать данные, надо связать с каж- дым элементом управления (есть исключения) свою переменную, опре- делить для них тип данных и присвоить им значения до вызова функции
DoModal. Например, с текстовым полем, статическим полем связывается
CStirng, с флажками и переключателями – int или BOOL.
Функции обработки DDX/DDV имеют общую структуру:
DDX(DDV)_
элемент
_
управления

(
указатель

на

объект

CDataExchange, куда
/
откуда

передавать
,
переменная

для

пе
-
редачи
/
записи
);
Например,
DDX_Scroll(pDx, IDC_SCROLL1, m_Scroll);

50
передаст данные из переменной-члена m_Scroll в элемент управления па-
нель прокрутки (Scroll) с идентификатором IDC_SCROLL1,
DDV_CbString(pDx, IDC_COMBO1, m_ComboStr); проверит и передаст выбранную строку из комбинированного списка с идентификатором IDC_COMBO1 в переменную m_ComboStr.
Напрямую функции DDV и DDX используются редко, обо всем за- ботится каркас приложения при вызове и возврате из функции DoModal.
Взаимодействие с окном для обмена данными строится также на основе механизма обработки сообщений, изученных в лабораторной работе № 2.
Так, например, сообщения BN_CLICKED, BN_DBLCLICK посыла- ются при нажатии на кнопки в окне, EM_UPDATE, EM_SETTEXT – об- рабатываются полями ввода, LB_SELCAHNGE – при смене выбора в списке и т. д.
Действия, которые выполняет программист для создания обработчи- ка событий, состоят в следующем:

открывается окно «ClassWizard» и выбирается класс диалогового ок- на (рис. 7);

выбирается нужный элемент управления по его идентификатору;

находится и выбирается нужное сообщение;

нажимается кнопка «Add Function» (если эта кнопка недоступна, то это значит, что обработчик уже создан, и тогда он просто редактиру- ется) и затем кнопка «Edit Code»;

создается код обработчика.
Элементы
Сообщения
Имя класса
Рис. 7. Менеджер классов – окно «MFC ClassWizard»
Существуют особенности обработки нажатий клавиш [Enter] и [Es- cape]. Обе клавиши закрывают окно, но делают это по-разному.

51
При нажатии клавиши [Enter] Windows ищет кнопку, на которой установлен фокус ввода (кнопка с пунктирной рамкой, рис. 8б). Если та- кой кнопки нет, то ищется кнопка по умолчанию (у такой кнопки более толстые границы, рис. 8в). Если и такой кнопки нет, то остается послед- ний вариант – вызывается базовая функция CDialog::OnOK, которая вы- зывает функцию DDV и закрывает окно.



Обычная кнопка
Кнопка с фокусом ввода
Кнопка по умолчанию а) б) в)
Рис. 8. Виды кнопок
Для управления процессом установки фокуса выполняются следую- щие действия:
1)
с помощью менеджера классов создается обработчик BN_CLICKED для кнопки IDOK;
2)
удаляется код CDialog::OnOK();
3)
снимается с кнопки «OK» стиль «Default Button» и изменяется ее идентификатор на ID_OK;
4)
изменяется порядок обхода кнопок в окне, то есть указывается, в ка- ком порядке кнопки будут становиться активными при нажатии кла- виши [Tab]. Изменение делается через меню «Layout» командой «Tab
Order», при выборе команды на экране появятся числа – это и есть порядок обхода (рис. 9). Нажав на объекты в правильном порядке, можно задать необходимый порядок обхода.
Рис. 9. Порядок обхода элементов управления
Конечно, для изменения порядка обхода в окне должно быть не ме- нее трех элементов. Аналогично можно обработать и клавишу [Escape].
Задание № 3. Сделайте необходимые изменения в проекте, ко- торый был создан в задании № 1, чтобы обход элементов осуществ- лялся слева направо и сверху вниз.
4.6. Элементы диалогового окна и их свойства
Находясь в редакторе диалоговых окон, щелкните правой кнопкой по диалоговому окну в свободном от элементов управления месте и выберите

52
команду «Properties». Откроется окно «Dialog Properties» (рис. 10). В этом окне можно установить стили диалогового окна и его свойства.
Рис. 10. Окно «Dialog Properties»
Рассмотрим основные элементы, меняющие свойства окна:

Font – выбор размера и гарнитуры шрифта диалогового окна;

XPos, YPos – начальное положение диалогового окна при старте приложения относительно верхнего левого угла экрана (смотри стиль
Absolute Align), но если установлен пункт Center, то поля игнориру- ются;

Caption – заголовок окна;

Menu – подключаемое меню;

Border – вид рамки окна;

Title Bar – отображается или нет строка заголовка;

System Menu, Minimize / Maximize Box, Context Help – кнопки си- стемного меню;

Horizontal / Vertical Scroll – полосы прокрутки;

System Modal – системное модальное окно;

Absolute Align – указывает, относительно чего задаются XPos / YPos: всего экрана или родительского окна;

Disabled – создается окно, которое по умолчанию недоступно;

Center – центрирует окно на экране;

Center Mouse – центрирует окно по положению мыши;

Tool Window – создает окно с более узкой строкой заголовка (как на панели инструментов);

Client Edge – окно с «утопленной» рабочей областью;

Transparent – прозрачное окно (действует только в Windows
2000/XP);

Accept Files – позволяет окошку реагировать на перетаскивание в не- го файлов;

Control Parent – позволяет переключаться между диалоговым и роди- тельским окном с помощью клавиши [Tab];

Right-to-left reading order – центровка текста.

53
С помощью панели инстурментов «Controls» (см. также рис. 6 на стр. 50) можно добавить на диалоговом окне:

рисунок
(Picture);

статический текст
(Static Text);

поле ввода
(Edit Box);

рамку
(Group Box);

кнопку
(Button);

флажок
(Checkbox);

переключатель
(Radio Button);

поле со списком
(Combobox);

список
(Listbox);

горизонтальную полосу прокрутки
(Horizontal Scrollbar);

вертикальную полосу прокрутки
(Vertical Scrollbar);

счетчик
(Spin);

индикатор продвижения
(Progress);

ползунок
(Slider);

горячую клавишу
(Hot Key);

графический список
(List Control);

древовидный список
(Tree Control);

вкладки
(Tab Control);

анимацию
(Animate);

поле ввода с форматированием
(Rich Edit);

выбор даты времени
(Date Time Picker);

календарь
(Month Calendar);

IP адрес
(IP Adress);

пользовательский элемент
(Custom Control);

расширенный комбинированный список
(Extended Combobox).
Некоторые из этих элементов являются статическими. Они несут лишь декоративный или вспомогательный смысл. Если эти элементы не изменяются во время выполнения программы, то им можно оставить идентификатор по умолчанию, если же необходимо их менять или управ- лять ими, то можно сменить идентификаторы.
Рамка. Ограничивает общие по смыслу элементы. Рассмотрим ос- новные свойства рамки:

Horizontal Alignment – указывает расположение заголовка рамки;

Icon / Bitmap – устанавливает вместо текстового заголовка пикто- грамму или рисунок в формате BMP;

Flat, Client Edge, Static Edge, Modal Frame – указывает глубину / вы- соту положения рамки;

54

Accept Files – позволяет окну реагировать на перетаскивание в него файлов;

Right-to-left reading order – центровка текста вправо.
Разберем на примере, как вставить вместо заголовка рисунок или пиктограмму:
1)
в редакторе диалоговых окон добавляется рамка и назначается ей идентификатор IDC_GROUP;
2)
создается обработчик функции WM_INITDIALOG для диалогого окна;
3)
в менеджере классов выбираются класс CDialogBox и сообщение
WM_INITDIALOG, нажимается кнопка «Add Fnction», а затем «Edit
Code»;
4)
пишется следущий код:
//
Получаем указатель на элемент управления
// по идентификатору
CButton* GroupBox=(CButton*)GetDlgItem(IDC_GROUP);
//
Назначаем стандартную иконку вопросительного
// знака
(IDI_QUESTION)
GroupBox->SetIcon(::LoadIcon(NULL, IDI_QUESTION));
Аналогично можно вставлять и рисунки через SetBitmap(HBITMAP) и ::LoadBitmap(HINSTANCE, int).
Статический текст. Используется в качестве подписи к полям.
Обычно текст сразу вписывается, но можно задать текст и во время ис- полнения программы. Для этого выполняются следующие действия:
1)
открывается редактор диалоговых окон, и вставляется в него текст с назначением идентификатора IDC_STATICTEXT;
2)
добавляется обработчик для нового элемента;
3)
в менеджере классов на вкладке «Member Variables» в списке «Con-
trol ID’s» выбирается IDC_STATICTEXT и нажимается кнопка «Add
Variable». Вводится имя переменной m_Text и выбирается для нее класс CString.
4)
в обработчике OnDialog (в менеджере классов выбирается класс
CView, идентификатор IDM_DIALOG, сообщение COMMAND и нажимается кнопка «Edit Code») добавляется следущий код (до функции DoModal): dlg.m_Text="
Новый текст ";
Данный прием «переменая – инициализация» является основой тео- рии модальных окон.
Основные свойства статического текста:

Align Text – форматирование текста (справа / слева);

Center Vertically – центровка по вертикали;

No prefix – запрещает использование символа «&» как знака для го- рячей клавиши и просто отображает его в тексте;

No wrap, simple – сжатый текст без разрывов;

55

Sinken, Border, Client Edge, Static Edge, Modal Frame – указывает глу- бину / высоту положения рамки;

Transperent – прозрачное поле.
Другие основные свойства данного элемента совпадают со свой- ствами элемента «Рамка».
Рисунок. Отображает в себе рисунок, пиктограмму или пустую рам- ку в зависимости от свойств. Для инициализации элемента необходимо задать один из типов (Type):

Frame (рамка);

Rectangle (закрашенная рамка);

Icon (пиктограмма);

Bitmap или Enhanced Metafile (*.emf).
Затем для Frame и Rectangle задают цвет заливки / закраски, а для
Bitmap / Icon – ресурс с пиктограммой или рисунком (в поле Image). En- hanced Metafile загружается программно.
Свойства элемента «Рисунок»: Sinken, Border, Client Edge, Static
Edge, Modal Frame – указывают глубину / высоту положения рамки.
Списки и поля ввода. Эти элементы в основном используются для заполнения форм. Они предоставляют пользователю возможность ввода текста и выбора предопределенных значений.
Элементы «Поле ввода» и «Поле ввода с форматированием» исполь- зуются для ввода текста. Эти два поля внешне одинаковы, но обычное поле ввода имеет ограничение на длину текста в 64 Кбайт и поддержива- ет лишь один тип шрифта, а поле с форматированием поддерживает больший объем текста и позволяет использовать шрифтовые выделения, но использование полей с форматированием в данной лабораторной ра- боте не рассматривается.
Все свойства полей определяются следующими стилями:

Align Text – форматирование текста (справа / слева);

Multiline – многострочное поле;

Number – вводятся только числа;

Auto HScroll / Auto VScroll – текст автоматически прокручивается вправо / вверх, когда курсор достигает края поля ввода;

Horizontal / Vertical Scroll – линейки прокрутки для поля;

Password – вводимые символы заменяются на знаки (применяется для ввода пароля);

Uppercase – автоматический перевод вводимых символов в верхний / нижний регистр;

No Hide Selection – выделенный текст остается выделенным, когда поле теряет фокус ввода;

Want return – для многострочного поля нажатие Enter приводит к но- вой строке, а не к нажатию кнопки по умолчанию;

56

Border – рамка вокруг поля;

Sinken, Border, Client Edge, Static Edge, Modal Frame – указывает глу- бину / высоту положения рамки;

Read Only – текст в поле можно только читать, а редактировать его нельзя;

Left Scroll bar – отображает линейку прокрутки у левого края поля ввода.
Также имеются и другие свойства у элементов «Поле ввода» и «Поле ввода с форматированием», которые аналогичны свойствам других эле- ментов.



Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал