Учебники

MFC — Основы Windows

В этой главе мы расскажем об основах Windows. Чтобы создать программу, также называемую приложением, вы извлекаете класс из CFC-приложения MFC. CWinApp расшифровывается как Class для приложения Windows.

Давайте рассмотрим простой пример, создав новый проект Win32.

Шаг 1 — Откройте Visual Studio и выберите пункт меню Файл → Создать → Проект.

Шаг 2 — Теперь вы можете увидеть диалоговое окно New Project.

Приложение для Windows

Шаг 3 — На левой панели выберите Шаблоны → Visual C ++ → Win32.

Шаг 4 — В средней панели выберите Win32 Project.

Шаг 5 — Введите имя проекта «MFCWindowDemo» в поле «Имя» и нажмите «ОК» для продолжения. Вы увидите следующее диалоговое окно.

Выберите проект Win32

Шаг 6 — Нажмите Далее.

Настройка приложения Win32

Шаг 7 — Выберите параметры, как показано в приведенном выше диалоговом окне, и нажмите «Готово».

MFCWindowsDemo

Шаг 8 — Пустой проект создан.

Шаг 9 — Чтобы сделать его проектом MFC, щелкните проект правой кнопкой мыши и выберите «Свойства».

Страница свойств MFCWindowDemo

Шаг 10 — В левом разделе нажмите Свойства конфигурации → Общие.

Шаг 11 — Выберите параметр «Использовать MFC в общей библиотеке DLL» в разделе «Параметры проекта по умолчанию» и нажмите «ОК».

Шаг 12 — Добавьте новый исходный файл.

Шаг 13 — Щелкните правой кнопкой мыши свой проект и выберите Добавить → Новый элемент …

Шаг 14 — В разделе Шаблоны выберите Файл C ++ (.cpp).

MFCWindowDemo Добавить новый товар

Шаг 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);
      }
};

Когда вы запускаете вышеуказанное приложение, вы видите тот же вывод.