Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Таблица 8
Сообщения о завершении
Название сообщения | Описание |
|
| WM_QUIT | Требование на завершение приложения |
| WM_QUERYENDSESSION | Запрос готовности приложения к завершению работы всей системы |
| WM_ENDSESSION | Уведомление о результатах запроса на завершение работы системы |
Частные сообщения. Очень просто определить собственные сообщения и использовать их для связи между различными окнами, которые Вы создаете. При определении частного сообщения необходимо использовать область значений, начинающуюся с WM_USER, следующим образом:
#define WM_USER 0x0400
Например, если мы хотим работать с окнами, которые показывают числа, то могли бы контролировать появление чисел различных систем исчисления с помощью следующих частных сообщений (РМ_ – префикс «частного сообщения» от Private Message):
#define PM_DECIMAL WM__USER + 0
#define PM_BINARY WM_USER + 1
#define PM_HEX WM_USER + 2
#define PM_OCTAL WMJJSER + 3
Кроме того, есть несколько частных системных сообщений (табл. 9).
Таблица 9
Частные системные сообщения
Название сообщения | Описание |
WM_CANCELMODE | Требование системы отменить режим, например, захват мыши |
WM_ENTERIDLE | Сообщает, что система находится в режиме ожидания |
Информационные сообщения системных ресурсов. Имеется всего семь сообщений с уведомлением об изменении некоторых системных ресурсов (табл.10). Они посылаются окну верхнего уровня каждой программы при изменении системного ресурса. Например, когда добавляются или удаляются шрифты в системе, распространяется сообщение WM_FONTCHANGE. А когда пользователь изменяет системные цвета или системное время, отправляются сообщения WM_SYSCOLORCHANGE или WM_TIMECHANGE, соответственно. Типичной реакцией на часть такого рода сообщений является немедленная запись произведенных изменений, т. е. сохранение выполненной работы.
Не всякое изменение представляет интерес для каждой программы. Например, программа, использующая таймер, вероятно, будет проверять новое значение времени при получении сообщения WM_TIMECHANGE. Но если она не работает со шрифтами, то, скорее всего, сообщение WM_FONTCHANGE будет проигнорировано. Поскольку большинство программ использует системные цвета, то они будут реагировать на сообщение WM_SYSCOLORCHANGE, организуя перерисовывание новыми цветами.
Таблица 10
Сообщения с уведомлением об изменениях системных ресурсов
Название сообщения | Описание |
WM_COMPACTING | Недостаточно системной памяти |
WM_DEVMODECHANGE | Изменилась настройка принтера |
WM_FONTCHANGE | Изменились установленные в системе шрифты |
WM_PALETTECHANGED | Палитра аппаратных цветов изменена |
WM_SPOOLERSTATUS | Задание было удалено из очереди буфера печати |
WM_SYSCOLORCHANGE | Один или более системных цветов изменены |
WM_TIMECHANGE | Изменилось системное время |
Сообщения о совместном использовании данных. В Windows есть сообщения, которые посылаются при совместном использовании данных для поддержки механизмов работы с буфером обмена (clipboard) и динамического обмена данными (DDE), которые определены в файлах WINUSER. H и DDE. H, соответственно.
Таблица 11
Сообщения о совместном использовании данных
Название сообщения | Описание |
Сообщения от буфера обмена | |
WM_ASKCBFORMATNAME | Запрашивает имя формата буфера обмена |
WM_CNANGECBCHAIN | Уведомление об изменении цепочки просмотра |
WM_DESTRIYCLIPBOARD | Содержимое буфера обмена уничтожено |
WM_DRAWCLIPBOARD | Содержимое буфера обмена изменено |
WM_HSCROLLCLIPBOARD | Горизонтальная прокрутка буфера обмена |
WM_PAINTCLIPBOARD | Запрашивает рисование буфера обмена |
WM_RENDERALLFORMATS | Запрашивает данные для всех ранее объявленных форматов буфера обмена |
WM_RENDERFORMAT | Запрашивает данные для ранее объявленного формата буфера обмена |
WM_SIZECLIPBOARD | Размер буфера обмена изменен |
WM_VSCROLLCLIPBOARD | Вертикальная прокрутка буфера обмена |
Сообщения DDE | |
WM_DDE_ACK | Подтверждение приема |
WM_DDE_ADVISE | Запрос от пользователя DDE об установлении постоянного канала передачи данных |
WM_DDE_DATA | Направляет элемент данных от DDE-сервера клиенту DDE |
WM_DDE_EXECUTE | Дает указание DDE-серверу выполнить серию команд |
WM_DDE_INITIATE | Вход в DDE-сервер |
WM_DDE_POKE | Запрос пользователя серверу об обновлении определенного элемента данных |
WM_DDE_REQUEST | Однократный запрос пользователя на информацию |
WM_DDE_TERMINATE | Выход из DDE-сервера |
WM_DDE_INADVISE | Завершить постоянный канал передачи данных, инициализированный сообщением WM_DDE_ADVISE |
Внутрисистемные сообщения. Помимо перечисленных, имеется большая группа сообщений, не описанных ни в какой документации. Это
внутренние системные сообщения, которые Windows использует в своих собственных целях. Эти сообщения передаются оконной процедуре и, если она их не обработает, то направляются обработчику сообщений, устанавливаемому по умолчанию.
В принципе, ничто не мешает вам использовать эти сообщения в собственных целях, но с определенной осторожностью. Найти их имена можно в файле WINUSER. H.
Задание № 7. Разработайте программу, обрабатывающую не менее трех типов сообщений из таблиц 5–11.
3.13. Содержание отчета
Отчет по лабораторной работе представляет собой распечатку созданных четырех программ с комментариями. Первая программа – новый обработчик сообщений от клавиатуры, вторая программа – новый обработчик сообщений от мыши, третья программа – два таймера, четвертая программа – обработка трех сообщений, не описанных в пп. 3.2–3.11.
Отчет должен содержать таблицу по проведенным экспериментам и исследованиям. Таблица состоит из двух столбцов. Первый содержит описание выполняемых действий (изменений), второй – результат изменений.
Также в отчет рекомендуется включить необходимые скриншоты созданных программ. Отчет должен быть подготовлен с помощью Microsoft Word и содержать титульный лист установленного образца.
3.14. Контрольные вопросы
1. Что такое сообщение?
2. Приведите классификацию сообщений.
3. Приведите не менее пяти примеров из разных типов сообщений.
4. Для чего служит очередь сообщений?
5. Что такое обработчик сообщений?
6. Дайте определение контексту устройства.
7. Опишите действия, которые должен выполнить программист для обработки сообщений.
8. Расскажите о процессе обработки сообщений Windows и программой.
9. В чем заключается проблема перерисовки?
10. Когда возникает проблема перерисовки?
11. Какие есть способы решения задачи перерисовки?
12. Какое сообщение помогает решить проблему перерисовки?
13. Что делает функция InvalidateRect?
14. Как запустить таймер в программе?
15. Как программа определяет таймер, который послал сообщение?
16. Как остановить таймер в программе?
17. Что делает функция TextOut?
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 во внеаудиторное время.
4. Лабораторная работа № 3.
Диалоговые окна
Время выполнения лабораторной работы – 6 часов.
Цель работы – изучить принципы создания диалоговых окон в программе.
Оборудование и программное обеспечение, необходимое для выполнения лабораторной работы: компьютер с процессором не хуже Pentium 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, а может представлять сложную форму с полями и элементами управления. Диалоговое окно – это настоящее окно. Оно имеет размеры, его можно перемещать, сворачивать, закрывать. Оно принимает и посылает сообщения и даже отрабатывает сообщения о перерисовке изображения в клиентской области.
Существует два типа диалоговых окон. Базовый класс CDialog поддерживает как модальные, так и немодальные диалоговые окна. Пока открыто модальное диалоговое окно (Modal Dialog) (например, Open File – открытие файла), пользователь не может работать ни с какой другой частью программы. Если же открыто немодальное диалоговое окно (Modeless Dialog), работать с другим окном программы можно. Например, диалоговое окно «Найти и заменить» Microsoft Word'а совершенно не мешает редактировать текст. Выбор типа окна зависит от характера приложения.
Диалоговое окно отличается от обычного окна Windows тем, что почти всегда связано с каким-нибудь ресурсом Windows, идентифицирующим элементы и определяющим структуру окна. Поскольку диалоговое окно можно редактировать в редакторе диалоговых окон, то они создаются быстро и наглядно.
Диалоговое окно содержит набор элементов управления (Controls). Windows управляет этими элементами, используя специальную логику группирования и обхода. На элементы управления ссылаются либо по указателю CWnd, так как элементы сами являются окнами, либо по идентификаторам определенных #define. Реагируя на действия пользователя, элементы передают сообщения родительскому диалоговому окну.
MFC и ClassWizard, тесно взаимодействуя, облегчают программирование диалоговых окон. ClassWizard генерирует класс, производный от CDialog, затем соотносит переменные и сообщения с элементами окна.
4.3. Создание диалогового окна в редакторе ресурсов
После добавления ресурса диалоговое окно появляется следующее окно (рис. 4).

Рис. 4. Заготовка для диалогового окна
Добавление элементов на диалоговое окно происходит аналогично с рисованием в векторном редакторе (выбираются соответствующие элементы на панели инструментов «Controls» и рисуются на форме). С помощью контекстно-зависимого меню, вызываемого правой кнопкой мыши, можно установить параметры элемента управления (пункт «Properties», рис. 5).
![]()

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

Рис. 6. Панель инструментов «Controls» и диалоговое окно
4.4. Модальные диалоговые окна
Общая схема создания и вызова модального окна такова:
1) с помощью редактора диалоговых окон создается окно;
2) менеджером классов (ClassWizard) определяется новый, производный от CDialog, класс для созданного окна;
3) определяется событие, после которого окно должно появиться на экране (выбор пункта меню, нажатие кнопкой мыши);
4) с помощью MFC создается обработчик этого события;
5) в обработчике создается экземпляр класса окна, вызывается базовая функция CDialog::DoModal();
6) если необходимо, обрабатываются возвращенные данные.
Рассмотрим это на конкретном примере.
Выбираем из меню «File» команду «New». На вкладке «Projects» выбираем из списка пункт «MFC AppWizard». В поле «Project name» вводим название проекта, например «DWindow».
На первом шаге мастера создания приложения выбираем Single Document. Второй, третий и четвертый проходим без изменений. На пятом шаге мастера определяются базовые классы. Необходимо, чтобы у класса 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
необходимо ввести следующий код:
// Создание экземпляра класса CDialogBox с именем dlg
CDialogBox dlg;
// Вызов окна
// процесс ждет возврата из окна
dlg. DoModal();
Также необходимо вставить в заголовок файла DWindowView. cpp после строк
#include "D_BoxDoc. h"
#include "D_BoxView. h"
строку
#include "DialogBox. h"
Возвращаемые данные пока не обрабатываем. Если нужно будет вызвать диалоговое окно щелчком мыши, в окне «ClassWizard» в списке «Object ID» указываем «CDWindowView» (т. е. само окно), в списке «Messages» указываем 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);
передаст данные из переменной-члена 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 – при смене выбора в списке и т. д.
Действия, которые выполняет программист для создания обработчика событий, состоят в следующем:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 |


