Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 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.

Последний параметр в функции CreateContext, обычно равен 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