Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Таблица 2
Режимы отображения
Константа отображения | Действие |
SW_HIDE | Окно закрывается, и активность передается другому окну (приложение при этом остается в памяти, можно увидеть на вкладке «Процессы» в диспетчере задач) |
SW_MAXIMIZE | Окно раскрывается на весь экран |
SW_MINIMIZE | Окно сворачивается в пиктограмму, и активизируется окно верхнего уровня в системном списке |
SW_SHOW | Окно активизируется и отображается в текущем положении и текущего размера |
SW_RESTORE | Окно активизируется и приводится к нормальному размеру и положению (указываются при создании окна), если оно было минимизировано или максимизировано |
SW_SHOWMAXIMIZED | Окно активизируется и отображается как максимизированное |
SW_SHOWMINIMIZED | Окно активизируется и отображается как пиктограмма |
SW_SHOWNOACTIVE | Окно отображается на новой позиции новым размером, окно, которое было активным, остается активным |
SW_SHOWMINNOACTIVE | Окно отображается в виде пиктограммы, окно, которое было активным, остается активным |
SW_SHOWNA | Окно отображается в его текущем состоянии, окно, которое было активным, остается активным |
SW_SHOWNORMAL | Окно активизируется и отображается в нормальном положении и нормального размера (задаются при создании окна) |
В конце программы помещены довольно странные команды:
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
END_MESSAGE_MAP()
Это так называемая очередь сообщений главного окна. В пределах данной очереди должны содержаться вызовы функций, ответственных за обработку поступающих сообщений. В нашем примере ни один из них в очередь не помещен, так как обработка сообщений не ведется. Однако именно она является важнейшей (если не основной) частью любого приложения Windows.
До сих пор был определен лишь вид главного окна и заложена основа приложения, но сами они не существуют до тех пор, пока не создан экземпляр объекта класса, производного от CWinApp. Это выполняется следующей инструкцией:
СAрр Арр;
Как уже упоминалось, в программе может быть лишь один объект класса CWinApp. Приложение начинает выполняться только после создания данного объекта.
Задание № 1. Запустите программу, приведенную в листинге № 1 (при этом необходимо установить требуемые опции компилятора и линковщика). Можно создать с помощью мастера (Wizard) готовое однодокументное приложение MFC, удалить все файлы из проекта и добавить данный файл. Исследуйте каждую строку программы, установите различные режимы отображения окна (требуется изменить параметр функции ShowWindow).
2.2. Подробнее о создании масштабируемых окон
В листинге № 1 было создано стандартное масштабируемое окно. Для простых программ этого может быть вполне достаточно, но, как правило, в главном окне должны находиться различные элементы управления. К счастью, их легко можно получить с помощью функции Create. Ее прототип таков:
BOOL CFrameWnd::Create(LPCSTR ClassName, // имя класса окна
LPCSTR Title, // заголовок окна
DWORD Style = WS_OVERLAPPEDWINDOW, // стиль
const RECT &XYsize = rectDefault, // позиция и размер
CWnd *Parent = NULL, // окно-предок
LPCSTR MenuName = NULL, // название главного меню
DWORD ExStyle = 0, // спецификатор расширенного стиля
CCreateContext *Context = NULL); // дополнительная структура контекста
Как видите, все параметры, кроме первых двух, содержат значения по умолчанию. Поэтому в примере мы могли использовать очень простую форму функции Create.
Первый параметр, ClassName, определяет указатель на имя класса окна. В данном контексте термин «класс» не связан с понятием класса в C++, а означает скорее стиль. Когда этот параметр равен NULL (а так, чаще всего, и есть), для окна используется стандартный класс, определенный в библиотеке MFC. Можно, однако, зарегистрировать собственное имя класса окна с помощью функции AfxRegisterWndClass.
Заголовок окна – это строка, на которую указывает параметр Title. Это может быть и пустая строка, но, как правило, окно все же имеет заголовок.
Стиль (или тип) создаваемого окна задается значением параметра Style. Константа WS_OVERLAPPEDWINDOW определяет стандартное окно, в котором имеются системное меню, рамка, кнопки минимизации, максимизации и закрытия. Таков стиль по умолчанию, если параметр Style не задан. Хотя этот стиль является наиболее общим, можно определить другой стиль по собственным критериям. Для этого достаточно с помощью операции побитового ИЛИ объединить несколько констант. Используемые константы приведены в таблице 3.
Таблица 3
Стили масштабируемых окон
Константа стиля | Стиль окна |
WS_BORDER | Окно имеет рамку без заголовка |
WS_CAPTION | Окно имеет заголовок и рамку; как правило, этот стиль используется для перекрывающихся окон и не может применяться совместно со стилем WS_DLGFRAME |
WS_CHILD | Дочернее окно; не может использоваться совместно со стилем WS_POPUP |
WS_CLIPCHILDREN | Исключает область, занятую дочерним окном, из области рисования родительского окна; используется только для родительских окон |
WS_CLIPSIBLINGS | Исключает все другие дочерние окна из своей области рисования; другими словами, если дочерние окна перекрываются, а этот стиль не указан, то при изменении рабочей области одного из окон могут быть испорчены рабочие области других дочерних окон; этот стиль используется только вместе со стилем WS_CHILD |
WS_DISABLED | Неактивное окно, т. е. сразу после его создания оно недоступно для ввода с клавиатуры или с помощью мыши |
WS_DLGFRAME | Окно имеет двойную рамку и не имеет заголовка |
WS_GROUP | Определяет первый элемент управления группы окон, к которым пользователь может переходить при помощи клавиш со стрелками; все элементы управления, определенные с этим стилем, заканчивают текущую и начинают новую группу (одна группа заканчивается там, где начинается другая) |
WS_HSCROLL | Окно имеет горизонтальную полосу прокрутки |
WS_VSCROLL | Окно имеет вертикальную полосу прокрутки |
WS_MAXIMIZE | Окно будет отображено в развернутом виде |
WS_MAXIMIZEBOX | Окно имеет кнопку «Развернуть»; если окно является дочерним окном элемента управления, то этот флаг стиля используется под другим именем – WS_TABSTOP |
Окончание табл. 3
Константа стиля | Стиль окна |
WS_MAXIMIZEBOX | Окно имеет кнопку «Развернуть»; если окно является дочерним окном элемента управления, то этот флаг стиля используется под другим именем – WS_TABSTOP |
WS_MINIMIZE | Окно будет отображено в виде значка; используется только со стилем WS_OVERLAPPED |
WS_MINIMIZEBOX | Окно имеет кнопку «Свернуть»; если окно является дочерним окном элемента управления, то этот флаг стиля используется под другим именем – WS_GROUP |
WS_OVERLAPPED | Окно является перекрывающимся; обычно имеет заголовок и рамку |
WS_POPUP | Всплывающее окно; не может использоваться совместно со стилем WS_CHILD |
WS_SYSMENU | Окно имеет значок системного меню в полосе заголовка |
WS_TABSTOP | Назначается одному или нескольким элементам управления для того, чтобы между ними можно было перемещаться с помощью клавиши табуляции Таb |
WS_THICKFRAME | Окно имеет утолщенную рамку, при помощи которой можно изменять размер окна |
WS_VISIBLE | Окно становится видимым сразу после создания; этот стиль в основном используется для окон диалога |
WS_OVERLAPPEDWINDOW | Комбинация стилей WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX |
WS_POPUPWINDOW | Комбинация стилей WS_POPUP, WS_BORDER и WS_SYSMENU |
Примечание. Префикс WS_ означает windows style (стиль окна).
Начальное расположение и размер окна определяются параметром XYsize. Если он не указан (в большинстве случаев), то оба значения будут выбраны операционной системой Windows. Однако их можно задавать и явно, передавая в качестве параметра ссылку на структуру типа RECT. Тип RECT объявлен следующим образом:
typedef struct tagRECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
Здесь необходимо определить координаты верхнего левого угла окна в переменных left и top, а также координаты нижнего правого угла в переменных right и bottom. Однако нужно помнить, что данные параметры задаются в абсолютных единицах (в данном случае в пикселях). Это означает, что координаты заданы по отношению к экрану.
Параметр Parent содержит указатель на окно, являющееся предком окна, создаваемого функцией Create. Так как главное окно находится на верхнем уровне иерархии окон программы, то в данном случае параметр должен иметь значение NULL.
Хотя в примере не создается главное меню, в большинстве реальных программ оно есть. В этом случае название меню необходимо указывать в параметре MenuName. Параметр является идентификатором соответствующего ресурса.
Атрибуты расширенного стиля окна задаются в параметре ExStyle. Если таковых нет, то указывается NULL.
Последний параметр в функции Create – Context, обычно равен NULL. Это указатель на структуру типа CCreateContext. Создание структур контекста является специальной задачей программирования, поэтому используется редко.
Функция Create возвращает ненулевое значение, если окно создано, и ноль, если создать окно невозможно.
Чтобы проверить, как используются дополнительные параметры в функции, можно заменить в примере конструктор CMainWin следующим кодом:
CMainWin :: CMainWin()
{
RECT r;
r. top = 10; r. left = 10;
r. bottom = r. right = 200;
Create(NULL, "Маленькое окно", WS_OVERLAPPEDWINDOW, r);
}
В этом случае будет создано стандартное окно, верхний левый угол которого имеет координаты (10,10), а правый нижний – (200, 200).
Задание № 2. В программе (листинг № 1) испытайте различные стили отображения окна, изучите каждый параметр функции Create. Постройте не менее 7 различных приложений, отличающихся видом окна (или в одном приложении создайте 7 различных видов окон).
2.3. Содержание отчета
Отчет по лабораторной работе представляет собой распечатку созданного программного кода с комментариями. Также в отчет рекомендуется включить необходимые скриншоты созданных окон. Отчет должен быть подготовлен с помощью Microsoft Word и содержать титульный лист установленного образца.
2.4. Контрольные вопросы
1. Назовите два класса, на базе которых строится простейшая программа (листинг № 1).
2. Какие необходимо выполнить действия программисту, чтобы создать минимальную программу?
3. Как работает простейшая программа?
4. Назовите несколько параметров функции Create и опишите их назначение.
5. Какие стили окна существуют?
6. Какие режимы отображения окна существуют?
7. Что делает функция ShowWindow?
8. Для чего нужна функция InitInstance?
9. Какие параметры необходимо выбрать в Wizard, чтобы создать пустой проект в Microsoft Visual C++?
10. Какие параметры необходимо задать в установках проекта, чтобы проект запускался в Microsoft Visual C++?
11. Как изменить название окна, которое видит пользователь?
12. Как создать окно без системной кнопки «Свернуть»?
2.5. Задачи на самостоятельную работу
1. Создайте приложение – круглое окно (задача простой сложности – программа описана в литературе).
2. Создайте приложение – прозрачное окно в Windows XP (задача простой сложности – программа описана в литературе).
3. Создайте приложение, которое не видно в диспетчере задач и в процессах (задача повышенной сложности – части программы опубликованы в Интернете).
2.6. Методика проведения лабораторной работы № 1
Лабораторная работа № 1 проводится на двух занятиях. Перед её началом студенты должны ознакомиться с текстом лабораторной работы (пп. 2.1 и 2.2).
Занятие № 1 (2 аудиторных часа). Изучение теоретического материала по пп. 2.1, 2.2. Подготовка ответов на контрольные вопросы. Запуск программы в среде Microsoft Visual C++ 6.0. Установка требуемых параметров по заданию № 1.
Занятие № 2 (2 аудиторных часа). Выполнение задания № 2 и подготовка отчета по п. 2.3. Защита отчета по лабораторной работе.
Повышение рейтинговой оценки за лабораторную работу возможно при выполнении одного задания из п. 2.5 во внеаудиторное время.
3. Лабораторная работа № 2.
Обработка сообщений
Время выполнения лабораторной работы – 6 часов.
Цель работы – изучить принцип взаимодействия программ и Windows.
Оборудование и программное обеспечение, необходимое для выполнения лабораторной работы: компьютер с процессором не хуже Pentium II с тактовой частотой 266 МГц, оперативной памятью не менее 64 Мб, с операционной системой Microsoft Windows 98/NT/2000/XP, средой программирования Microsoft Visual C++ 6.0.
3.1. Что такое сообщения?
В операционной системе Windows имеется огромное число сообщений. Каждое из них представляется уникальным целым значением. В библиотечном файле WINUSER. Н для всех сообщений определены стандартные имена. Вот наиболее распространенные сообщения:
WM_CHAR WM_PAINT WM_MOVE
WM_CLOSE WM_LBUTTONUP WM_SIZE
WM_LBUTTONDOWN WM_COMMAND
Пример определения имени сообщения:
#define WM_COMMAND 0x0lll
или
#define WM_PAINT 0x000F
Часто сообщения сопровождаются различными числовыми параметрами, несущими дополнительную информацию. К ним относятся, например, координаты текстового курсора или курсора мыши, код нажатой клавиши, а также некоторые системные значения, такие как размер символа.
Windows взаимодействует с программой через механизм сообщений. В частности, каждый раз, когда происходит определенное событие, на которое должна отреагировать программа, ей посылается сообщение, определяющее данное событие. Важно понимать, что нет необходимости явно отвечать на все сообщения. Фактически, из-за огромного их числа программа не будет реагировать на большинство из них. Обрабатывать нужно только те сообщения, которые относятся непосредственно к программе. Для остальных в библиотеке MFC содержатся стандартные обработчики.
Сообщения классифицируются следующим образом:
- аппаратные сообщения;
- сообщения обслуживания окна;
- сообщения организации интерфейса пользователя;
- сообщения о завершении;
- частные сообщения;
- информационные сообщения системных ресурсов;
- сообщения о совместном использовании данных;
- внутрисистемные сообщения.
Информацию о типе сообщения содержит префикс. Префикс «WM_» говорит о том, что речь идет об «оконном сообщении» (от Window Message), «ЕМ_» (Edit Message) используется для сообщений элемента управления Edit, «BM_» (Button Message) – для сообщений элемента управления Button, «LM_» (Listbox Message) – для сообщений элемента управления Listbox и т. д.
3.2. Обработка сообщений в MFC
Для организации обработки сообщения необходимо выполнить следующие действия:
1) в очередь сообщений программы должна быть включена макрокоманда соответствующего сообщения;
2) прототип функции-обработчика должен быть включен в описание класса, ответственного за обработку данного сообщения;
3) в программу должна быть включена реализация функции-обработчика.
Теперь давайте рассмотрим этот механизм подробнее.
3.3. Включение макрокоманд в очередь сообщений
В программе очередей сообщения может быть несколько. Каждое окно может обрабатывать сообщения. К какому из окон относится данная очередь, определяется в параметрах макроса BEGIN_MESSAGE_MAP. Его общий вид приведен ниже:
BEGIN_MESSAGE_MAP(Владелец, Базовый)
// здесь помещаются макрокоманды сообщений
END_MESSAGE_MAP()
Название класса, к которому относится очередь, определяется параметром Владелец. Параметр Базовый определяет название базового класса, от которого был порожден класс-владелец. Например, в очереди
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
// здесь помещаются макрокоманды сообщений
END_MESSAGE_MAP()
классом-владельцем является CMainWin, который порождается от стандартного класса CFrameWnd, предназначенного для создания масштабируемых окон.
Чтобы программа могла ответить на сообщение, в очередь сообщений должна быть помещена связанная с ним макрокоманда. Названия макрокоманд в MFC соответствуют именам стандартных сообщений Windows, но дополнительно имеют префикс ON_ и заканчиваются парой круглых скобок. Однако из этого правила есть одно исключение: сообщению WM_COMMAND соответствует макрокоманда ON_COMMAND(). Причина заключается в том, что WM_COMMAND – это особое сообщение, которое специальным образом обрабатывается в MFC. Ниже приведены названия макрокоманд MFC, соответствующих перечисленным выше сообщениям:
ON_WM_CHAR() ON_WM_PAINT()
ON_WM_MOVE() ON_WM_CLOSE() ON_WM_LBUTTONUP() ON_WM_LBUTTONDOWN()
ON_COMMAND() ON_WM_S1ZE()
Чтобы включить макрокоманду в очередь сообщений, нужно просто поместить ее между макросами BEGIN_MESSAGE_MAP и END_MESSAGE_MAP. Например, если необходимо, чтобы в программе обрабатывалось сообщение WM_CHAR, то очередь сообщений должна выглядеть следующим образом:
BEGIN MESSAGE_MAP(CMainWin, CFrameWnd)
ON_WM_CHAR()
END_MESSAGE_MAP()
Конечно, в очереди может находиться более одной макрокоманды. Например, в следующем примере производится обработка сообщений WM_CHAR и WM_LBUTTONDOWN.
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
ON_WM_CHAR()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
Как будет показано дальше, сообщение WM_CHAR генерируется при нажатии клавиши на клавиатуре, а сообщение WM_LBUTTONDOWN – при нажатии левой кнопки мыши.
3.4. Включение обработчиков сообщений в описание класса
Каждое сообщение, обрабатываемое в программе, должно быть связано с одним из обработчиков. Все обработчики сообщений являются членами класса CWnd и могут быть переопределены в программе. Как правило, имя функции-обработчика состоит из названия сообщения (без WM_), которому предшествует префикс On. Например, обработчик для WM_CHAR называется OnChar, для WM_LBUTTONDOWN – OnLButtonDown, для WM_PAINT – OnPaint.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 |


