В этой главе мы расскажем об основах Windows. Чтобы создать программу, также называемую приложением, вы извлекаете класс из CFC-приложения MFC. CWinApp расшифровывается как Class для приложения Windows.
Давайте рассмотрим простой пример, создав новый проект Win32.
Шаг 1 — Откройте Visual Studio и выберите пункт меню Файл → Создать → Проект.
Шаг 2 — Теперь вы можете увидеть диалоговое окно New Project.
Шаг 3 — На левой панели выберите Шаблоны → Visual C ++ → Win32.
Шаг 4 — В средней панели выберите Win32 Project.
Шаг 5 — Введите имя проекта «MFCWindowDemo» в поле «Имя» и нажмите «ОК» для продолжения. Вы увидите следующее диалоговое окно.
Шаг 6 — Нажмите Далее.
Шаг 7 — Выберите параметры, как показано в приведенном выше диалоговом окне, и нажмите «Готово».
Шаг 8 — Пустой проект создан.
Шаг 9 — Чтобы сделать его проектом MFC, щелкните проект правой кнопкой мыши и выберите «Свойства».
Шаг 10 — В левом разделе нажмите Свойства конфигурации → Общие.
Шаг 11 — Выберите параметр «Использовать MFC в общей библиотеке DLL» в разделе «Параметры проекта по умолчанию» и нажмите «ОК».
Шаг 12 — Добавьте новый исходный файл.
Шаг 13 — Щелкните правой кнопкой мыши свой проект и выберите Добавить → Новый элемент …
Шаг 14 — В разделе Шаблоны выберите Файл C ++ (.cpp).
Шаг 15 — Установите имя в качестве примера и нажмите «Добавить».
Создание окна
Любое приложение имеет два основных раздела —
- Учебный класс
- Рамка или Окно
Давайте создадим окно, используя следующие шаги —
Шаг 1 — Чтобы создать приложение, нам нужно извлечь класс из CWinApp MFC.
#include class CExample : public CWinApp { BOOL InitInstance() { return TRUE; } };
Шаг 2 — Нам также нужен фрейм / окно для отображения содержимого нашего приложения.
Шаг 3 — Для этого нам нужно добавить еще один класс и извлечь его из класса CFrameWnd MFC, реализовать его конструктор и вызвать метод Create (), который создаст кадр / окно, как показано в следующем коде.
class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial")); } };
Шаг 4. Как видите, для метода Create () нужны два параметра: имя класса, которое должно быть передано как NULL, и имя окна, которое является строкой, которая будет отображаться в строке заголовка.
Главное окно
После создания окна, чтобы позволить приложению использовать его, вы можете использовать указатель, чтобы показать класс, используемый для создания окна. В этом случае указатель будет CFrameWnd. Чтобы использовать окно фрейма, присвойте его указатель переменной-члену CWinThread :: m_pMainWnd. Это делается в реализации InitInstance () вашего приложения.
Шаг 1 — Вот реализация InitInstance () в классе CExample.
class CExample : public CWinApp { BOOL InitInstance() { CMyFrame *Frame = new CMyFrame(); m_pMainWnd = Frame; Frame->ShowWindow(SW_NORMAL); Frame->UpdateWindow(); return TRUE; } };
Шаг 2 — Ниже приведена полная реализация файла Example.cpp.
#include <afxwin.h> class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial")); } }; class CExample : public CWinApp { BOOL InitInstance() { CMyFrame *Frame = new CMyFrame(); m_pMainWnd = Frame; Frame->ShowWindow(SW_NORMAL); Frame->UpdateWindow(); return TRUE; } }; CExample theApp;
Шаг 3 — Когда мы запускаем вышеуказанное приложение, создается следующее окно.
Стили Windows
Стили Windows — это характеристики, которые управляют такими функциями, как внешний вид окна, границы, свернутое или развернутое состояние или другие состояния изменения размера и т. Д.
Sr.No. | Стиль и описание |
---|---|
1 |
WS_BORDER Создает окно с рамкой. |
2 |
WS_CAPTION Создает окно с заголовком (подразумевает стиль WS_BORDER). Не может использоваться со стилем WS_DLGFRAME. |
3 |
WS_CHILD Создает дочернее окно. Не может использоваться со стилем WS_POPUP. |
4 |
WS_CHILDWINDOW То же, что и стиль WS_CHILD. |
5 |
WS_CLIPCHILDREN Исключает область, занимаемую дочерними окнами при рисовании в родительском окне. Используется при создании родительского окна. |
6 |
стиль WS_CLIPSIBLINGS Обрезает дочерние окна относительно друг друга; то есть, когда конкретное дочернее окно получает сообщение рисования, стиль WS_CLIPSIBLINGS обрезает все другие перекрывающиеся дочерние окна из области дочернего окна, подлежащей обновлению. (Если WS_CLIPSIBLINGS не задан и дочерние окна перекрываются, когда вы рисуете в клиентской области дочернего окна, можно рисовать в клиентской области соседнего дочернего окна.) Только для использования со стилем WS_CHILD. |
7 |
WS_DISABLED Создает окно, которое изначально отключено. |
8 |
WS_DLGFRAME Создает окно с двойной рамкой, но без заголовка. |
9 |
WS_GROUP Определяет первый элемент управления группы элементов управления, в которых пользователь может переходить от одного элемента управления к следующему с помощью клавиш со стрелками. Все элементы управления, определенные с FALSE в стиле WS_GROUP после первого элемента управления, принадлежат одной и той же группе. Следующий элемент управления со стилем WS_GROUP запускает следующую группу (то есть одна группа заканчивается там, где начинается следующая). |
10 |
WS_HSCROLL Создает окно с горизонтальной полосой прокрутки. |
11 |
WS_ICONIC Создает окно, которое изначально свернуто. То же, что и стиль WS_MINIMIZE. |
12 |
WS_MAXIMIZE Создает окно максимального размера. |
13 |
WS_MAXIMIZEBOX Создает окно с кнопкой «Развернуть». |
14 |
WS_MINIMIZE Создает окно, которое изначально свернуто. Только для использования со стилем WS_OVERLAPPED. |
15 |
WS_MINIMIZEBOX Создает окно с кнопкой «Свернуть». |
16 |
WS_OVERLAPPED Создает перекрывающееся окно. Перекрывающееся окно обычно имеет заголовок и границу. |
17 |
WS_OVERLAPPED WINDOW Создает перекрывающееся окно со стилями WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX. |
18 |
WS_POPUP Создает всплывающее окно. Не может использоваться со стилем WS_CHILD. |
19 |
WS_POPUPWINDOW Создает всплывающее окно со стилями WS_BORDER, WS_POPUP и WS_SYSMENU. Стиль WS_CAPTION должен сочетаться со стилем WS_POPUPWINDOW, чтобы сделать меню управления видимым. |
20 |
WS_SIZEBOX Создает окно с границей размеров. То же, что и стиль WS_THICKFRAME. |
21 |
WS_SYSMENU Создает окно, которое имеет строку меню Control в строке заголовка. Используется только для окон с заголовками. |
22 |
WS_TABSTOP Указывает один из любого количества элементов управления, с помощью которых пользователь может перемещаться с помощью клавиши TAB. Клавиша TAB перемещает пользователя к следующему элементу управления, указанному в стиле WS_TABSTOP. |
23 |
WS_THICKFRAME Создает окно с толстой рамкой, которое можно использовать для определения размера окна. |
24 |
WS_TILED Создает перекрывающееся окно. Перекрытое окно имеет строку заголовка и границу. То же, что и стиль WS_OVERLAPPED. |
25 |
WS_TILEDWINDOW Создает перекрывающееся окно со стилями WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX. То же, что и стиль WS_OVERLAPPEDWINDOW. |
26 |
WS_VISIBLE Создает окно, которое изначально видно. |
27 |
WS_VSCROLL Создает окно с вертикальной полосой прокрутки. |
WS_BORDER
Создает окно с рамкой.
WS_CAPTION
Создает окно с заголовком (подразумевает стиль WS_BORDER). Не может использоваться со стилем WS_DLGFRAME.
WS_CHILD
Создает дочернее окно. Не может использоваться со стилем WS_POPUP.
WS_CHILDWINDOW
То же, что и стиль WS_CHILD.
WS_CLIPCHILDREN
Исключает область, занимаемую дочерними окнами при рисовании в родительском окне. Используется при создании родительского окна.
стиль WS_CLIPSIBLINGS
Обрезает дочерние окна относительно друг друга; то есть, когда конкретное дочернее окно получает сообщение рисования, стиль WS_CLIPSIBLINGS обрезает все другие перекрывающиеся дочерние окна из области дочернего окна, подлежащей обновлению. (Если WS_CLIPSIBLINGS не задан и дочерние окна перекрываются, когда вы рисуете в клиентской области дочернего окна, можно рисовать в клиентской области соседнего дочернего окна.) Только для использования со стилем WS_CHILD.
WS_DISABLED
Создает окно, которое изначально отключено.
WS_DLGFRAME
Создает окно с двойной рамкой, но без заголовка.
WS_GROUP
Определяет первый элемент управления группы элементов управления, в которых пользователь может переходить от одного элемента управления к следующему с помощью клавиш со стрелками. Все элементы управления, определенные с FALSE в стиле WS_GROUP после первого элемента управления, принадлежат одной и той же группе. Следующий элемент управления со стилем WS_GROUP запускает следующую группу (то есть одна группа заканчивается там, где начинается следующая).
WS_HSCROLL
Создает окно с горизонтальной полосой прокрутки.
WS_ICONIC
Создает окно, которое изначально свернуто. То же, что и стиль WS_MINIMIZE.
WS_MAXIMIZE
Создает окно максимального размера.
WS_MAXIMIZEBOX
Создает окно с кнопкой «Развернуть».
WS_MINIMIZE
Создает окно, которое изначально свернуто. Только для использования со стилем WS_OVERLAPPED.
WS_MINIMIZEBOX
Создает окно с кнопкой «Свернуть».
WS_OVERLAPPED
Создает перекрывающееся окно. Перекрывающееся окно обычно имеет заголовок и границу.
WS_OVERLAPPED WINDOW
Создает перекрывающееся окно со стилями WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX.
WS_POPUP
Создает всплывающее окно. Не может использоваться со стилем WS_CHILD.
WS_POPUPWINDOW
Создает всплывающее окно со стилями WS_BORDER, WS_POPUP и WS_SYSMENU. Стиль WS_CAPTION должен сочетаться со стилем WS_POPUPWINDOW, чтобы сделать меню управления видимым.
WS_SIZEBOX
Создает окно с границей размеров. То же, что и стиль WS_THICKFRAME.
WS_SYSMENU
Создает окно, которое имеет строку меню Control в строке заголовка. Используется только для окон с заголовками.
WS_TABSTOP
Указывает один из любого количества элементов управления, с помощью которых пользователь может перемещаться с помощью клавиши TAB. Клавиша TAB перемещает пользователя к следующему элементу управления, указанному в стиле WS_TABSTOP.
WS_THICKFRAME
Создает окно с толстой рамкой, которое можно использовать для определения размера окна.
WS_TILED
Создает перекрывающееся окно. Перекрытое окно имеет строку заголовка и границу. То же, что и стиль WS_OVERLAPPED.
WS_TILEDWINDOW
Создает перекрывающееся окно со стилями WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX. То же, что и стиль WS_OVERLAPPEDWINDOW.
WS_VISIBLE
Создает окно, которое изначально видно.
WS_VSCROLL
Создает окно с вертикальной полосой прокрутки.
Шаг 1 — Давайте посмотрим на простой пример, в котором мы добавим некоторые стили. После создания окна, чтобы отобразить его пользователю, мы можем применить к нему стиль WS_VISIBLE и дополнительно добавим стиль WS_OVERLAPPED. Вот реализация —
class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial"), WS_VISIBLE | WS_OVERLAPPED); } };
Шаг 2 — Когда вы запускаете это приложение, создается следующее окно.
Теперь вы можете видеть, что параметры минимизации, максимизации и закрытия больше не отображаются.
Расположение Windows
Для определения местоположения объектов, отображаемых на мониторе, компьютер использует систему координат, аналогичную декартовой, но начало координат находится в верхнем левом углу экрана. Используя эту систему координат, любая точка может быть расположена на расстоянии от верхнего левого угла экрана по горизонтальной и вертикальной осям.
Библиотека Win32 предоставляет структуру POINT, определенную следующим образом:
typedef struct tagPOINT { LONG x; LONG y; } POINT;
-
Переменная-член ‘x’ — это расстояние от левой границы экрана до точки.
-
Переменная ‘y’ представляет расстояние от верхней границы экрана до точки.
-
Помимо структуры POINT в Win32, библиотека Microsoft Foundation Class (MFC) предоставляет класс CPoint.
-
Это обеспечивает ту же функциональность, что и структура POINT. Как класс C ++, он добавляет больше функциональности, необходимой для определения местоположения точки. Он предоставляет два конструктора.
Переменная-член ‘x’ — это расстояние от левой границы экрана до точки.
Переменная ‘y’ представляет расстояние от верхней границы экрана до точки.
Помимо структуры POINT в Win32, библиотека Microsoft Foundation Class (MFC) предоставляет класс CPoint.
Это обеспечивает ту же функциональность, что и структура POINT. Как класс C ++, он добавляет больше функциональности, необходимой для определения местоположения точки. Он предоставляет два конструктора.
CPoint(); CPoint(int X, int Y);
Размер Windows
В то время как точка используется для определения местоположения объекта на экране, каждое окно имеет размер. Размер обеспечивает две меры, связанные с объектом.
- Ширина объекта.
- Высота объекта.
Библиотека Win32 использует структуру SIZE, определенную следующим образом:
typedef struct tagSIZE { int cx; int cy; } SIZE;
Помимо структуры SIZE в Win32, MFC предоставляет класс CSize. Этот класс имеет те же функциональные возможности, что и SIZE, но добавляет функции класса C ++. Он предоставляет пять конструкторов, которые позволяют вам создавать переменные размера любым способом по вашему выбору.
CSize(); CSize(int initCX, int initCY); CSize(SIZE initSize); CSize(POINT initPt); CSize(DWORD dwSize);
Размеры Windows
Когда отображается окно, его можно определить на экране по его расположению относительно границ монитора. Окно также можно определить по ширине и высоте. Эти характеристики указываются или управляются прямым аргументом метода Create () . Этот аргумент представляет собой прямоугольник, который можно создать с помощью структуры Win32 RECT.
typedef struct _RECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT;
Помимо структуры RECT Win32, MFC предоставляет класс CRect, который имеет следующие конструкторы:
CRect(); CRect(int l, int t, int r, int b); CRect(const RECT& srcRect); CRect(LPCRECT lpSrcRect); CRect(POINT point, SIZE size); CRect(POINT topLeft, POINT bottomRight);
Давайте посмотрим на простой пример, в котором мы будем указывать расположение и размер окна
class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial"), WS_SYSMENU, CRect(90, 120, 550, 480)); } };
При запуске этого приложения в верхнем левом углу экрана создается следующее окно, как указано в конструкторе CRect в первых двух параметрах. Последние два параметра — это размер окна.
Windows Parents
В реальном мире многие приложения сделаны из разных окон. Когда приложение использует различные Windows, большинство объектов зависят от конкретного. Это может быть первое окно, которое было создано, или другое окно, которое вы определили. Такое окно называется родительским окном . Все остальные окна зависят от этого прямо или косвенно.
-
Если создаваемое вами окно зависит от другого, вы можете указать, что у него есть родительский элемент.
-
Это делается с помощью аргумента pParentWnd метода CFrameWnd :: Create ().
-
Если у окна нет родителя, передайте аргумент со значением NULL.
Если создаваемое вами окно зависит от другого, вы можете указать, что у него есть родительский элемент.
Это делается с помощью аргумента pParentWnd метода CFrameWnd :: Create ().
Если у окна нет родителя, передайте аргумент со значением NULL.
Давайте рассмотрим пример, в котором есть только одно окно, а родительское окно недоступно, поэтому мы передадим аргумент со значением NULL, как показано в следующем коде:
class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial"), WS_SYSMENU, CRect(90, 120, 550, 480), NULL); } };
Когда вы запускаете вышеуказанное приложение, вы видите тот же вывод.