Учебники

MFC — Краткое руководство

МФЦ — Обзор

Библиотека Microsoft Foundation Class (MFC) предоставляет набор функций, констант, типов данных и классов для упрощения создания приложений для операционных систем Microsoft Windows. В этом руководстве вы узнаете все о том, как запускать и создавать приложения на базе Windows с помощью MFC.

Предпосылки

Мы предположили, что вы знаете следующее —

  • Немного о программировании для Windows.
  • Основы программирования на C ++.
  • Понимать основы объектно-ориентированного программирования.

Что такое МФЦ?

Microsoft Foundation Class Library (MFC) — это «среда приложения» для программирования в Microsoft Windows. MFC предоставляет большую часть кода, который требуется для следующего —

  • Управление Windows.
  • Меню и диалоговые окна.
  • Выполнение основного ввода / вывода.
  • Хранение коллекций объектов данных и т. Д.

Вы можете легко расширить или переопределить базовую функциональность инфраструктуры MFC в своих приложениях C ++, добавив свой специфичный для приложения код в среду MFC.

MFC Framework

  • Инфраструктура MFC предоставляет набор повторно используемых классов, предназначенных для упрощения программирования Windows.

  • MFC предоставляет классы для многих базовых объектов, таких как строки, файлы и коллекции, которые используются в повседневном программировании.

  • Он также предоставляет классы для общих API-интерфейсов Windows и структур данных, таких как окна, элементы управления и контексты устройства.

  • Каркас также обеспечивает прочную основу для более продвинутых функций, таких как ActiveX и обработка представления документов.

  • Кроме того, MFC предоставляет среду приложения, включая классы, составляющие иерархию архитектуры приложения.

Инфраструктура MFC предоставляет набор повторно используемых классов, предназначенных для упрощения программирования Windows.

MFC предоставляет классы для многих базовых объектов, таких как строки, файлы и коллекции, которые используются в повседневном программировании.

Он также предоставляет классы для общих API-интерфейсов Windows и структур данных, таких как окна, элементы управления и контексты устройства.

Каркас также обеспечивает прочную основу для более продвинутых функций, таких как ActiveX и обработка представления документов.

Кроме того, MFC предоставляет среду приложения, включая классы, составляющие иерархию архитектуры приложения.

Почему МФЦ?

Платформа MFC — это мощный подход, который позволяет вам опираться на работу опытных программистов для Windows. Структура MFC имеет следующие преимущества.

  • Это сокращает время разработки.

  • Это делает код более переносимым.

  • Он также обеспечивает огромную поддержку, не уменьшая свободу и гибкость программирования.

  • Он обеспечивает легкий доступ к «сложным для программирования» элементам и технологиям пользовательского интерфейса.

  • MFC упрощает программирование базы данных с помощью объектов доступа к данным (DAO) и Open Database Connectivity (ODBC), а также сетевое программирование с помощью сокетов Windows.

Это сокращает время разработки.

Это делает код более переносимым.

Он также обеспечивает огромную поддержку, не уменьшая свободу и гибкость программирования.

Он обеспечивает легкий доступ к «сложным для программирования» элементам и технологиям пользовательского интерфейса.

MFC упрощает программирование базы данных с помощью объектов доступа к данным (DAO) и Open Database Connectivity (ODBC), а также сетевое программирование с помощью сокетов Windows.

MFC — Настройка среды

Microsoft Visual C ++ — это среда программирования, используемая для создания приложений для операционных систем Microsoft Windows. Для использования инфраструктуры MFC в вашем приложении C ++ вы должны установить Microsoft Visual C ++ или Microsoft Visual Studio. Microsoft Visual Studio также содержит среду Microsoft Visual C ++.

Microsoft предоставляет бесплатную версию Visual Studio, которая также содержит SQL Server, и ее можно скачать с https://www.visualstudio.com/en-us/downloads/downloadvisual- studio-vs.aspx .

Ниже приведены шаги установки.

Шаг 1. После загрузки Visual Studio запустите установщик. Появится следующее диалоговое окно.

Visual Studio

Шаг 2 — Нажмите «Установить», чтобы начать процесс установки.

Visual Studio Установка

Шаг 3. После успешной установки Visual Studio вы увидите следующее диалоговое окно.

Visual Studio установлена

Шаг 4 — Закройте это диалоговое окно и перезагрузите компьютер, если это необходимо.

Шаг 5 — Откройте Visual Studio из меню «Пуск», которое откроет следующее диалоговое окно. Это займет некоторое время для подготовки, начиная с первого раза.

Visual Studio Подготовка

Шаг 6 — Далее вы увидите главное окно Visual Studio.

Visual Studio Главное окно

Шаг 7 — Теперь вы готовы запустить приложение.

MFC — VC ++ Projects

В этой главе мы рассмотрим различные типы проектов VC ++. Visual Studio включает несколько видов шаблонов проектов Visual C ++. Эти шаблоны помогают создавать базовую структуру программы, меню, панели инструментов, значки, ссылки и включают в себя операторы, соответствующие типу проекта, который вы хотите создать. Ниже приведены некоторые характерные особенности шаблонов.

  • Он предоставляет мастера для многих из этих шаблонов проектов и помогает настраивать проекты по мере их создания.

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

  • Вам не нужно использовать шаблон для создания проекта, но в большинстве случаев более эффективно использовать шаблоны проектов.

  • Легче изменить предоставленные файлы проекта и структуру, чем создать их с нуля.

Он предоставляет мастера для многих из этих шаблонов проектов и помогает настраивать проекты по мере их создания.

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

Вам не нужно использовать шаблон для создания проекта, но в большинстве случаев более эффективно использовать шаблоны проектов.

Легче изменить предоставленные файлы проекта и структуру, чем создать их с нуля.

В MFC вы можете использовать следующие шаблоны проектов.

Sr.No. Шаблон и описание проекта
1

Приложение MFC

Приложение MFC — это исполняемое приложение для Windows, основанное на библиотеке Microsoft Foundation Class (MFC). Самый простой способ создать приложение MFC — использовать мастер приложений MFC.

2

MFC ActiveX Control

Управляющие программы ActiveX — это модульные программы, разработанные для предоставления определенного типа функциональности родительскому приложению. Например, вы можете создать элемент управления, например кнопку для использования в диалоговом окне, на панели инструментов или на веб-странице.

3

MFC DLL

MFC DLL — это двоичный файл, который действует как общая библиотека функций, которые могут одновременно использоваться несколькими приложениями. Самый простой способ создать проект MFC DLL — использовать мастер MFC DLL.

Приложение MFC

Приложение MFC — это исполняемое приложение для Windows, основанное на библиотеке Microsoft Foundation Class (MFC). Самый простой способ создать приложение MFC — использовать мастер приложений MFC.

MFC ActiveX Control

Управляющие программы ActiveX — это модульные программы, разработанные для предоставления определенного типа функциональности родительскому приложению. Например, вы можете создать элемент управления, например кнопку для использования в диалоговом окне, на панели инструментов или на веб-странице.

MFC DLL

MFC DLL — это двоичный файл, который действует как общая библиотека функций, которые могут одновременно использоваться несколькими приложениями. Самый простой способ создать проект MFC DLL — использовать мастер MFC DLL.

Ниже приведены некоторые общие шаблоны, которые также можно использовать для создания приложения MFC.

Sr.No. Шаблон и описание проекта
1

Пустой проект

Проекты — это логические контейнеры для всего, что нужно для создания вашего приложения. Затем вы можете добавить больше новых или существующих проектов в решение, если это необходимо.

2

Custom Wizard

Visual C ++ Custom Wizard — это инструмент, который нужно использовать, когда вам нужно создать новый настраиваемый мастер. Самый простой способ создать настраиваемый мастер — использовать настраиваемый мастер.

Пустой проект

Проекты — это логические контейнеры для всего, что нужно для создания вашего приложения. Затем вы можете добавить больше новых или существующих проектов в решение, если это необходимо.

Custom Wizard

Visual C ++ Custom Wizard — это инструмент, который нужно использовать, когда вам нужно создать новый настраиваемый мастер. Самый простой способ создать настраиваемый мастер — использовать настраиваемый мастер.

MFC — Начало работы

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

Создать проект с использованием шаблонов проектов

Ниже приведены шаги по созданию проекта с использованием шаблонов проектов, доступных в Visual Studio.

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

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

проект

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

Шаг 4 — В средней панели выберите Приложение MFC.

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

Применение MFCDemo

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

Тип приложения MFC

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

Параметры приложения MFC

Шаг 8 — Снимите все флажки и нажмите кнопку Готово.

Теперь вы можете видеть, что мастер MFC создает это диалоговое окно и файлы проекта по умолчанию.

Мастер MFC

Шаг 9 — Запустите это приложение, вы увидите следующий вывод.

Результат применения MFC

Создать проект с нуля

Вы также можете создать приложение MFC с нуля. Чтобы создать приложение MFC, вам необходимо выполнить следующие шаги.

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

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

Создать Скретч

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

Шаг 4 — В средней панели выберите Пусто

Шаг 5 — Введите имя проекта «MFCDemoFromScratch» в поле «Имя» и нажмите «ОК» для продолжения. Вы увидите, что создан пустой проект.

MFCDemoFromScratch

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

Выберите MFC Project & Properties

Шаг 7 — В левой части выберите Свойства конфигурации → Общие.

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

Шаг 9 — Так как сейчас это пустой проект; нам нужно добавить файл C ++. Итак, щелкните правой кнопкой мыши на проекте и выберите Добавить → Новый элемент …

Добавить новый предмет

Шаг 10 — Выберите C ++ File (.cpp) в средней панели, введите имя файла в поле Name и нажмите кнопку Add.

Введите имя файла

Шаг 11 — Теперь вы можете увидеть файл main.cpp, добавленный в папку «Исходные файлы».

Шаг 12 — Давайте добавим следующий код в этот файл.

#include <iostream> 
using namespace std;  

void main() { 
   cout << "***************************************\n"; 
   cout << "MFC Application Tutorial"; 
   cout << "\n***************************************"; 
   getchar(); 
}

Шаг 13 — Когда вы запустите это приложение, вы увидите следующий вывод на консоли.

*************************************** 
MFC Application Tutorial 
***************************************

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);
      }
};

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

Окно созданного приложения

MFC — Диалоговые окна

В этой главе мы рассмотрим диалоговые окна. Приложения для Windows часто общаются с пользователем через диалоговые окна. Класс CDialog предоставляет интерфейс для управления диалоговыми окнами. Диалоговый редактор Visual C ++ позволяет легко проектировать диалоговые окна и создавать их ресурсы шаблона диалога.

  • Создание объекта диалога является двухфазной операцией —

    • Построить объект диалога.

    • Создайте диалоговое окно.

Создание объекта диалога является двухфазной операцией —

Построить объект диалога.

Создайте диалоговое окно.

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

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

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

Диалоговое окно «Новый проект»

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

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

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

MFCDialogDemo Project

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

Настройка MFCDialogDemo

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

Параметры MFCDialogDemo

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

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

MFCDialogDemo Property

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

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

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

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

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

MFCDialogDemo Добавить запись

Шаг 15 — Установите имя в качестве примера и нажмите «Добавить».

Шаг 16. Чтобы создать приложение, нам нужно добавить класс и извлечь его из CWinApp MFC.

#include <afxwin.h>

class CExample : public CWinApp {
   public:
      BOOL InitInstance();
};

Создание диалогового окна

Шаг 1. Чтобы создать диалоговое окно, щелкните правой кнопкой мыши папку Resource Files в обозревателе решений и выберите Add → Resource.

Добавить ресурс

Шаг 2 — В диалоговом окне «Добавить ресурс» выберите «Диалог» и нажмите «Создать».

Шаг 3 — Диалоговое окно требует некоторой подготовки, прежде чем фактически его создавать программно.

Шаг 4 — Сначала можно вручную создать диалоговое окно в виде текстового файла (в файле ресурсов).

Шаг 5 — Теперь вы можете увидеть файл MFCDialogDemo.rc, созданный в разделе Resource Files.

MFCDialogDemo FIle

Шаг 6 — Файл ресурсов открыт в конструкторе. То же самое можно открыть как текстовый файл. Щелкните правой кнопкой мыши файл ресурса и выберите «Открыть с помощью».

Открыть с помощью файла MFCDialogDemo

Шаг 7 — Выберите редактор исходного кода (текст) и нажмите кнопку Добавить.

Редактор исходного кода

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

DialogBox Выбрать свойства

Шаг 9 — Вам нужно выбрать из множества вариантов.

Шаг 10 — Как и большинство других элементов управления, диалоговое окно должно быть идентифицировано. Идентификатор (ID) диалогового окна обычно начинается с IDD_. Давайте изменим ID на IDD_EXAMPLE_DLG.

Расположение диалога

Диалоговое окно должно быть «физически» расположено в приложении. Поскольку диалоговое окно обычно создается в качестве родительского элемента для других элементов управления, его расположение зависит от его отношения к родительскому окну или к рабочему столу.

Если вы посмотрите и окно свойств, вы увидите два поля, X Pos и ​​Y Pos.

Расположение диалога

  • X — расстояние от левой границы монитора до левой границы диалогового окна.

  • Y — расстояние от верхней границы монитора до верхней границы диалогового окна.

X — расстояние от левой границы монитора до левой границы диалогового окна.

Y — расстояние от верхней границы монитора до верхней границы диалогового окна.

По умолчанию эти поля установлены на ноль. Вы также можете изменить, как показано выше.

Если вы укажете эти два измерения как 0, левая и верхняя границы диалогового окна будут установлены так, что объект появится в центре по центру экрана.

Диалоговое окно Размеры

Размеры диалогового окна относятся к его ширине и высоте. Вы можете изменить ширину и высоту с помощью мыши в окне дизайнера.

Диалоговое окно Размер

Вы можете увидеть изменения ширины и высоты в строке состояния.

Методы диалоговых окон

Базовый класс, используемый для отображения диалоговых окон на экране, — это класс CDialog. Чтобы создать диалоговое окно, нам нужно извлечь класс из CDialog. Сам класс CDialog предоставляет три конструктора:

CDialog();
CDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);
CDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

Давайте создадим еще один класс CExampleDlg и выведем его из CDialog. Мы реализуем его конструктор по умолчанию, как показано в следующем коде.

class CExampleDlg : public CDialog {
   public:
      enum { IDD = IDD_EXAMPLE_DLG };
   
      CExampleDlg();
      ~CExampleDlg();
};

CExampleDlg::CExampleDlg():CDialog(CExampleDlg::IDD) {

}

CExampleDlg::~CExampleDlg() {

}

Нам нужно создать этот диалог в методе CExample :: InitInstance (), как показано в следующем коде.

BOOL CExample::InitInstance() {
   CExampleDlg myDlg;
   m_pMainWnd = &myDlg;
   
   return TRUE;
}

Модальные диалоговые окна

Существует два типа диалоговых окон — немодальное и модальное . Модальные и немодальные диалоговые окна отличаются процессом, используемым для их создания и отображения.

Немодальное диалоговое окно

  • Для немодального диалогового окна вы должны предоставить свой собственный общедоступный конструктор в вашем диалоговом классе.

  • Чтобы создать немодальное диалоговое окно, вызовите ваш общедоступный конструктор, а затем вызовите функцию Create member объекта диалога, чтобы загрузить ресурс диалога.

  • Вы можете вызвать Create во время или после вызова конструктора. Если ресурс диалога имеет свойство WS_VISIBLE, диалоговое окно появляется немедленно.

  • Если нет, вы должны вызвать его функцию-член ShowWindow.

Для немодального диалогового окна вы должны предоставить свой собственный общедоступный конструктор в вашем диалоговом классе.

Чтобы создать немодальное диалоговое окно, вызовите ваш общедоступный конструктор, а затем вызовите функцию Create member объекта диалога, чтобы загрузить ресурс диалога.

Вы можете вызвать Create во время или после вызова конструктора. Если ресурс диалога имеет свойство WS_VISIBLE, диалоговое окно появляется немедленно.

Если нет, вы должны вызвать его функцию-член ShowWindow.

Модальный диалог

  • Чтобы создать модальное диалоговое окно, вызовите любой из двух открытых конструкторов, объявленных в CDialog.

  • Затем вызовите функцию- член DoModal объекта диалога, чтобы отобразить диалоговое окно и управлять взаимодействием с ним, пока пользователь не выберет OK или Отмена.

  • Это управление DoModal делает модальное диалоговое окно. Для модальных диалоговых окон DoModal загружает ресурс диалога.

Чтобы создать модальное диалоговое окно, вызовите любой из двух открытых конструкторов, объявленных в CDialog.

Затем вызовите функцию- член DoModal объекта диалога, чтобы отобразить диалоговое окно и управлять взаимодействием с ним, пока пользователь не выберет OK или Отмена.

Это управление DoModal делает модальное диалоговое окно. Для модальных диалоговых окон DoModal загружает ресурс диалога.

Шаг 1 — Чтобы отобразить диалоговое окно как модальное, в событии CExample :: InitInstance () вызовите метод DoModal () с помощью вашей диалоговой переменной —

BOOL CExample::InitInstance() {
   CExampleDlg myDlg;
   m_pMainWnd = &myDlg;
   myDlg.DoModal();
   return TRUE;
}

Шаг 2 — Вот полная реализация файла Example.cpp.

#include <afxwin.h>
#include "resource.h"

class CExample : public CWinApp {
   public:
      BOOL InitInstance();
};
   
class CExampleDlg : public CDialog {
   public:
      enum { IDD = IDD_EXAMPLE_DLG };
   
      CExampleDlg();
     ~CExampleDlg();
};

CExampleDlg::CExampleDlg():CDialog(CExampleDlg::IDD) {

}

CExampleDlg::~CExampleDlg() {

}

BOOL CExample::InitInstance() {
   CExampleDlg myDlg;
   m_pMainWnd = &myDlg;
   myDlg.DoModal();
   return TRUE;
}
CExample MyApp;

Шаг 3 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующее диалоговое окно.

Диалоговое окно

Приложения на основе диалогов

Microsoft Visual Studio предоставляет более простой способ создания приложения, основанного главным образом на диалоговом окне. Вот шаги для создания базового проекта диалога, используя шаблоны проектов, доступные в Visual Studio —

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

Диалоговый шаблон проекта

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

Шаг 3 — В средней панели выберите Приложение MFC.

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

MFCModalDemo Application2

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

MFCModalDemo Type

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

Параметры приложения MFCModalDemo

Шаг 7 — Отметьте все параметры, которые вы выбрали в диалоговом окне, такие как «Развернуть и свернуть поля», и нажмите «Далее».

MFCModalDemo Расширенные возможности

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

MFCModalDemo сгенерированные классы

Шаг 9 — Он сгенерирует эти два класса. Вы можете изменить название классов и нажать «Готово».

Шаг 10. Теперь вы видите, что мастер MFC создает это диалоговое окно и файлы проекта по умолчанию.

Приложение DialogBox

Шаг 11 — Когда вы запустите это приложение, вы увидите следующий вывод.

MFCModalDemo Результат

MFC — ресурсы Windows

Ресурс — это текстовый файл, который позволяет компилятору управлять такими объектами, как изображения, звуки, курсоры мыши, диалоговые окна и т. Д. Microsoft Visual Studio особенно упрощает создание файла ресурсов, предоставляя необходимые инструменты в той же среде, которая используется для программирования. Это означает, что вам обычно не нужно использовать внешнее приложение для создания или настройки файла ресурсов. Ниже приведены некоторые важные функции, связанные с ресурсами.

  • Ресурсы — это элементы интерфейса, которые предоставляют информацию пользователю.

  • Растровые изображения, значки, панели инструментов и курсоры — все это ресурсы.

  • Некоторыми ресурсами можно манипулировать для выполнения действия, такого как выбор из меню или ввод данных в диалоговом окне.

  • Приложение может использовать различные ресурсы, которые ведут себя независимо друг от друга, эти ресурсы сгруппированы в текстовый файл с расширением * .rc.

  • Большинство ресурсов создаются путем выбора нужного из диалогового окна «Добавить ресурс».

Ресурсы — это элементы интерфейса, которые предоставляют информацию пользователю.

Растровые изображения, значки, панели инструментов и курсоры — все это ресурсы.

Некоторыми ресурсами можно манипулировать для выполнения действия, такого как выбор из меню или ввод данных в диалоговом окне.

Приложение может использовать различные ресурсы, которые ведут себя независимо друг от друга, эти ресурсы сгруппированы в текстовый файл с расширением * .rc.

Большинство ресурсов создаются путем выбора нужного из диалогового окна «Добавить ресурс».

Добавить ресурс

  • Диалоговое окно Add Resource предоставляет обширный список ресурсов, которые можно использовать в соответствии с требованиями, но если вам нужно что-то, что недоступно, вы можете добавить его вручную в файл * .rc перед выполнением программы.

Диалоговое окно Add Resource предоставляет обширный список ресурсов, которые можно использовать в соответствии с требованиями, но если вам нужно что-то, что недоступно, вы можете добавить его вручную в файл * .rc перед выполнением программы.

Идентификаторы

Идентификатор — это символ, который является постоянным целым числом, имя которого обычно начинается с идентификатора. Он состоит из двух частей — текстовой строки (имени символа), сопоставленной с целочисленным значением (значением символа).

  • Символы предоставляют описательный способ обращения к ресурсам и объектам пользовательского интерфейса как в исходном коде, так и во время работы с ними в редакторах ресурсов.

  • Когда вы создаете новый ресурс или объект ресурса, редакторы ресурсов предоставляют имя ресурса по умолчанию, например, IDC_DIALOG1, и присваивают ему значение.

  • Определение «имя-плюс-значение» хранится в файле Resource.h.

Символы предоставляют описательный способ обращения к ресурсам и объектам пользовательского интерфейса как в исходном коде, так и во время работы с ними в редакторах ресурсов.

Когда вы создаете новый ресурс или объект ресурса, редакторы ресурсов предоставляют имя ресурса по умолчанию, например, IDC_DIALOG1, и присваивают ему значение.

Определение «имя-плюс-значение» хранится в файле Resource.h.

Шаг 1 — Давайте посмотрим на наш пример CMFCDialogDemo из последней главы, в которой мы создали диалоговое окно и его ID — IDD_EXAMPLE_DLG .

CMFCDialogDemo

Шаг 2 — Перейдите в Solution Explorer, вы увидите файл resource.h в разделе Header Files. Продолжите, открыв этот файл в редакторе, и вы увидите идентификатор диалогового окна и его целочисленное значение.

Identifiers2

Иконки

Значок — это маленькая картинка, используемая в окне, представляющая приложение. Он используется в двух основных сценариях.

  • На рамке окна оно отображается слева от названия окна в строке заголовка.

  • В проводнике Windows, на рабочем столе, в моем компьютере или в окне панели управления.

На рамке окна оно отображается слева от названия окна в строке заголовка.

В проводнике Windows, на рабочем столе, в моем компьютере или в окне панели управления.

Если вы посмотрите на наш пример MFCModalDemo, вы увидите, что Visual Studio использовала значок по умолчанию для строки заголовка, как показано на следующем снимке.

Иконки

Вы можете создать свой собственный значок, следуя инструкциям ниже:

Шаг 1 — Щелкните правой кнопкой мыши по своему проекту и выберите «Добавить» → «Ресурсы», откроется диалоговое окно «Добавить ресурсы».

Выберите Добавить ресурсы

Шаг 2 — Выберите Icon и нажмите кнопку New, и вы увидите следующий значок.

Значок

Шаг 3 — В Solution Explorer перейдите в Resource View и разверните MFCModalDemo> Icon. Вы увидите две иконки. IDR_MAINFRAME является значением по умолчанию, а IDI_ICON1 является вновь созданным значком.

Шаг 4 — Щелкните правой кнопкой мыши по вновь созданному значку и выберите Свойства.

Шаг 5 — IDI_ICON1 является идентификатором этого значка, теперь давайте изменим этот идентификатор на IDR_MYICON.

Шаг 6 — Теперь вы можете изменить этот значок в конструкторе в соответствии с вашими требованиями. Мы будем использовать тот же значок.

Шаг 7 — Сохраните этот значок.

Шаг 8 — Перейдите к конструктору CMFCModalDemoDlg в файле CMFCModalDemoDlg.cpp, который будет выглядеть как следующий код.

CMFCModalDemoDlg::CMFCModalDemoDlg(CWnd* pParent /* = NULL*/)
   : CDialogEx(IDD_MFCMODALDEMO_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_MAINFRAME);
}

Шаг 9 — Теперь вы можете видеть, что значок по умолчанию загружен в конструктор. Давайте изменим его на IDR_ MYICON, как показано в следующем коде.

CMFCModalDemoDlg::CMFCModalDemoDlg(CWnd* pParent /* = NULL*/)
   : CDialogEx(IDD_MFCMODALDEMO_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_ MYICON);
}

Шаг 10 — Когда приведенный выше код скомпилирован и выполнен, вы увидите, что новый значок отображается в диалоговом окне.

Модальный Демо

меню

Меню позволяют вам упорядочивать команды логично и легко найти. С помощью редактора меню вы можете создавать и редактировать меню, работая непосредственно со строкой меню, которая очень похожа на строку в готовом приложении. Чтобы создать меню, выполните следующие действия:

Шаг 1 — Щелкните правой кнопкой мыши по вашему проекту и выберите «Добавить» → «Ресурсы». Вы увидите диалоговое окно Add Resources.

Добавить ресурсы меню

Шаг 2 — Выберите Меню и нажмите Новый. Вы увидите прямоугольник с надписью «Введите здесь» в строке меню.

Введите здесь в строке меню

Шаг 3 — Напишите некоторые пункты меню, такие как «Файл», «Редактировать» и т. Д., Как показано на следующем снимке.

Опции меню

Шаг 4 — Если вы развернете папку «Меню» в представлении ресурсов, вы увидите идентификатор меню IDR_MENU1. Щелкните правой кнопкой мыши по этому идентификатору и измените его на IDM_MAINMENU.

Идентификатор меню

Шаг 5 — Сохраните все изменения.

Шаг 6 — Нам нужно прикрепить это меню к нашему диалоговому окну. Разверните папку Dialog в обозревателе решений и дважды щелкните идентификатор диалогового окна.

Папка диалога

Шаг 7 — Вы увидите поле меню в Свойствах. Выберите идентификатор меню из выпадающего списка, как показано выше.

Шаг 8 — Запустите это приложение, и вы увидите следующее диалоговое окно, которое также содержит пункты меню.

Вариант меню

Панели инструментов

Панель инструментов — это элемент управления Windows, который позволяет пользователю выполнять некоторые действия с формой, нажимая кнопку вместо использования меню.

  • Панель инструментов предоставляет удобную группу кнопок, которая упрощает работу пользователя, предлагая наиболее доступные действия в виде кнопок.

  • Панель инструментов может приблизить такие общие действия к пользователю.

  • Панели инструментов обычно отображаются под главным меню.

  • Они могут быть оснащены кнопками, но иногда их кнопки или некоторые кнопки имеют подпись.

  • Панели инструментов также могут быть оснащены другими типами элементов управления.

Панель инструментов предоставляет удобную группу кнопок, которая упрощает работу пользователя, предлагая наиболее доступные действия в виде кнопок.

Панель инструментов может приблизить такие общие действия к пользователю.

Панели инструментов обычно отображаются под главным меню.

Они могут быть оснащены кнопками, но иногда их кнопки или некоторые кнопки имеют подпись.

Панели инструментов также могут быть оснащены другими типами элементов управления.

Чтобы создать панель инструментов, выполните следующие действия.

Шаг 1 — Щелкните правой кнопкой мыши по вашему проекту и выберите «Добавить» → «Ресурсы». Вы увидите диалоговое окно Add Resources.

Панель инструментов

Шаг 2 — Выберите Панель инструментов и нажмите Новый. Вы увидите следующий экран.

Выберите панель инструментов

Шаг 3. Создайте панель инструментов в конструкторе, как показано на следующем снимке экрана, а также укажите идентификаторы.

Панель инструментов дизайна

Шаг 4 — Добавьте эти две переменные в класс CMFCModalDemoDlg.

   CToolBar m_wndToolBar;
   BOOL butD;

Шаг 5 — Ниже приведена полная реализация CMFCModalDemoDlg в файле CMFCModalDemoDlg.h —

class CMFCModalDemoDlg : public CDialogEx {
   // Construction
   public:
      CMFCModalDemoDlg(CWnd* pParent = NULL); // standard constructor
   // Dialog Data
   #ifdef AFX_DESIGN_TIME
      enum { IDD = IDD_MFCMODALDEMO_DIALOG };
   #endif

   protected:
      virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
   
   // Implementation
   protected:
      HICON m_hIcon;
      CToolBar m_wndToolBar;
      BOOL butD;
   
      // Generated message map functions
      virtual BOOL OnInitDialog();
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      DECLARE_MESSAGE_MAP()
	
   public:
      afx_msg void OnBnClickedOk();
};

Шаг 6 — Обновите CMFCModalDemoDlg :: OnInitDialog (), как показано в следующем коде.

BOOL CMFCModalDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
   
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);       // Set big icon
   SetIcon(m_hIcon, FALSE);      // Set small icon
   
   if (!m_wndToolBar.Create(this)
      || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1))
      //if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD |
      // WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS |
      // CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
      // !m_wndToolBar.LoadToolBar(IDR_TOOLBAR1)) {
         TRACE0("Failed to Create Dialog Toolbar\n");
         EndDialog(IDCANCEL);
      }
      butD = TRUE;
      CRect rcClientOld; // Old Client Rect
      CRect rcClientNew; // New Client Rect with Tollbar Added
		
      // Retrive the Old Client WindowSize
      // Called to reposition and resize control bars in the client area of a window
      // The reposQuery FLAG does not really traw the Toolbar. It only does the calculations.
      // And puts the new ClientRect values in rcClientNew so we can do the rest of the Math.
      
      GetClientRect(rcClientOld);
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNew);
      // All of the Child Windows (Controls) now need to be moved so the Tollbar does not cover them up.
      // Offest to move all child controls after adding Tollbar 
      CPoint ptOffset(rcClientNew.left - rcClientOld.left, rcClientNew.top - rcClientOld.top); 
		 
      CRect rcChild;
      CWnd* pwndChild = GetWindow(GW_CHILD); //Handle to the Dialog Controls
      
      while (pwndChild) // Cycle through all child controls {
         pwndChild -> GetWindowRect(rcChild); // Get the child control RECT
         ScreenToClient(rcChild);
          
         // Changes the Child Rect by the values of the claculated offset
         rcChild.OffsetRect(ptOffset);
         pwndChild -> MoveWindow(rcChild, FALSE); // Move the Child Control
         pwndChild = pwndChild -> GetNextWindow();
      }
       
      CRect rcWindow;
      // Get the RECT of the Dialog
      GetWindowRect(rcWindow);
       
      // Increase width to new Client Width
      rcWindow.right += rcClientOld.Width() - rcClientNew.Width();
       
      // Increase height to new Client Height
       rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
      // Redraw Window
      MoveWindow(rcWindow, FALSE);
       
      // Now we REALLY Redraw the Toolbar
      RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
       
   // TODO: Add extra initialization here

   return TRUE; // return TRUE unless you set the focus to a control
}

Шаг 7 — Запустите это приложение. Вы увидите следующее диалоговое окно, которое также содержит панель инструментов.

Toolbar4

Ускорители

Клавиша доступа — это буква, которая позволяет пользователю быстрее выполнять действия в меню, используя клавиатуру вместо мыши. Обычно это происходит быстрее, поскольку пользователю не нужно никуда размещать мышь, что сокращает время, необходимое для выполнения действия.

Шаг 1 — Чтобы создать ключ доступа, введите амперсанд «&» слева от пункта меню.

Создать ключ доступа

Шаг 2 — Повторите этот шаг для всех пунктов меню. Запустите это приложение и нажмите Alt. Вы увидите, что первая буква всех пунктов меню подчеркнута.

Вариант меню

Быстрая клавиша

Сочетание клавиш — это клавиша или комбинация клавиш, используемая опытными пользователями для выполнения действия, которое в противном случае было бы выполнено для элемента меню. Большинство сочетаний клавиш представляют собой комбинацию клавиши Ctrl, одновременно нажатой с помощью буквенной клавиши. Например, Ctrl + N, Ctrl + O или Ctrl + D.

Чтобы создать ярлык, в правой части строки, которая составляет заголовок меню, щелкните правой кнопкой мыши элемент меню и выберите свойства.

В поле «Заголовок» введите \ t, а затем нужную комбинацию, как показано ниже для параметра «Новое меню». Повторите этот шаг для всех пунктов меню.

Быстрая клавиша

Ускоритель

Таблица ускорителей — это список элементов, в котором каждый элемент таблицы объединяет идентификатор, сочетание клавиш и постоянное число, которое определяет тип клавиши ускорения. Как и другие ресурсы, таблицу ускорений можно создать вручную в файле .rc. Ниже приведены шаги для создания таблицы акселератора.

Шаг 1 — Чтобы создать таблицу ускорений, щелкните правой кнопкой мыши файл * .rc в обозревателе решений.

Ускоритель

Шаг 2 — Выберите ускоритель и нажмите «Создать».

Выберите ускоритель

Шаг 3 — Нажмите на стрелку поля со списком ID и выберите пункт меню.

Ускоритель

Шаг 4 — Выберите Ctrl из выпадающего списка Модификатор.

Шаг 5 — Щелкните поле «Ключ» и введите соответствующие ключи для обоих пунктов меню.

Мы также добавим новый обработчик события пункта меню в тестирование. Щелкните правой кнопкой мыши пункт «Новое меню».

Обработчик события

Шаг 6 — Вы можете указать класс, тип сообщения и имя обработчика. А пока оставим все как есть и нажмите кнопку «Добавить и изменить».

Имя обработчика типа сообщения

Шаг 7 — Выберите Добавить обработчик событий.

Шаг 8 — Теперь вы увидите событие, добавленное в конец файла CMFCModalDemoDlg.cpp.

void CMFCModalDemoDlg::OnFileNew() {
   // TODO: Add your command handler code here
   MessageBox(L"File > New menu option");
}

Шаг 9Теперь давайте добавим окно сообщения, которое будет отображать простую опцию меню сообщения.

Для запуска таблицы акселератора в рабочем режиме добавьте переменную HACCEL и ProcessMessageFilter, как показано в следующем CMFCModalDemoApp.

class CMFCModalDemoApp : public CWinApp {
   public:
      CMFCModalDemoApp();
   
   // Overrides
   public:
      virtual BOOL InitInstance();
      HACCEL m_hAccelTable;
      
      // Implementation

      DECLARE_MESSAGE_MAP()
      virtual BOOL ProcessMessageFilter(int code, LPMSG lpMsg);
};

Шаг 10 — Загрузите ускоритель и следующий вызов в CMFCModalDemoApp :: InitInstance ().

m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
   MAKEINTRESOURCE(IDR_ACCELERATOR1));

Шаг 11 — Вот реализация ProcessMessageFilter.

BOOL CMFCModalDemoApp::ProcessMessageFilter(int code, LPMSG lpMsg) {
   if (code >= 0 && m_pMainWnd && m_hAccelTable) {
      if (::TranslateAccelerator(m_pMainWnd -> m_hWnd, m_hAccelTable, lpMsg))
      return TRUE;
   }
   return CWinApp::ProcessMessageFilter(code, lpMsg);
}

Шаг 12 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Ускоритель Результат

Шаг 13 — Нажмите кнопку Alt, затем клавишу F, а затем клавишу N или Ctrl + N. Вы увидите следующее сообщение.

Ускоритель

MFC — листы недвижимости

Лист свойств , также известный как диалоговое окно с вкладкой, представляет собой диалоговое окно, содержащее страницы свойств. Каждая страница свойств основана на ресурсе шаблона диалога и содержит элементы управления. Он вложен в страницу с вкладкой сверху. Вкладка называет страницу и указывает ее назначение. Пользователи щелкают вкладку в окне свойств, чтобы выбрать набор элементов управления.

Чтобы создать страницы свойств, давайте рассмотрим простой пример создания диалогового проекта MFC.

Проект МФЦ

Как только проект создан, нам нужно добавить несколько страниц свойств.

Visual Studio позволяет легко создавать ресурсы для страниц свойств, отображая диалоговое окно «Добавить ресурс», раскрывая узел «Диалог» и выбирая один из элементов IDD_PROPPAGE_X.

Шаг 1 — Щелкните правой кнопкой мыши свой проект в обозревателе решений и выберите «Добавить» → «Ресурсы».

IDD Propage Larg

Шаг 2 — Выберите IDD_PROPPAGE_LARGE и нажмите NEW.

IDD Propage Larg New

Шаг 3 — Давайте изменим ID и заголовок этой страницы свойств на IDD_PROPPAGE_1 и Страница свойств соответственно, как показано выше.

Шаг 4 — Щелкните правой кнопкой мыши на странице свойств в окне дизайнера.

Propage в окне дизайнера

Шаг 5 — Выберите опцию Добавить класс.

Propage Add Class Option

Шаг 6 — Введите имя класса и выберите CPropertyPage из выпадающего списка базового класса.

Шаг 7 — Нажмите Готово, чтобы продолжить.

Шаг 8 — Добавьте еще одну страницу свойств с идентификатором IDD_PROPPAGE_2 и Caption Property Page 2, выполнив вышеупомянутые шаги.

Шаг 9 — Теперь вы можете увидеть две страницы свойств. Для реализации его функциональности нам нужен лист свойств.

Лист свойств группирует страницы свойств и сохраняет их как сущность.

Чтобы создать лист свойств, выполните следующие действия:

Шаг 1 — Щелкните правой кнопкой мыши по вашему проекту и выберите «Добавить»> «Параметры меню класса».

Создать лист недвижимости

Шаг 2. Выберите Visual C ++ → MFC на левой панели и класс MFC на панели шаблонов и нажмите кнопку Добавить.

Класс MFC в панели шаблонов

Шаг 3 — Введите имя класса и выберите CPropertySheet из выпадающего списка базового класса.

Шаг 4 — Нажмите «Готово», чтобы продолжить.

Шаг 5 — Чтобы запустить этот лист свойств, нам нужны следующие изменения в нашем основном классе проекта.

Шаг 6 — Добавьте следующие ссылки в файл CMFCPropSheetDemo.cpp.

#include "MySheet.h"
#include "PropPage1.h"
#include "PropPage2.h"

Шаг 7. Измените метод CMFCPropSheetDemoApp :: InitInstance (), как показано в следующем коде.

CMySheet mySheet(L"Property Sheet Demo");
CPropPage1 page1;
CPropPage2 page2;

mySheet.AddPage(&page1);
mySheet.AddPage(&page2);

m_pMainWnd = &mySheet;
INT_PTR nResponse = mySheet.DoModal();

Шаг 8 — Вот полная реализация файла CMFCPropSheetDemo.cpp.


// MFCPropSheetDemo.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "MFCPropSheetDemo.h"
#include "MFCPropSheetDemoDlg.h"
#include "MySheet.h"
#include "PropPage1.h"
#include "PropPage2.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFCPropSheetDemoApp
BEGIN_MESSAGE_MAP(CMFCPropSheetDemoApp, CWinApp)
   ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// CMFCPropSheetDemoApp construction

CMFCPropSheetDemoApp::CMFCPropSheetDemoApp() {

   // support Restart Manager
   m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
   // TODO: add construction code here,
   // Place all significant initialization in InitInstance
}


// The one and only CMFCPropSheetDemoApp object

CMFCPropSheetDemoApp theApp;


// CMFCPropSheetDemoApp initialization

BOOL CMFCPropSheetDemoApp::InitInstance() {
   
   // InitCommonControlsEx() is required on Windows XP if an application
   // manifest specifies use of ComCtl32.dll version 6 or later to enable
   // visual styles. Otherwise, any window creation will fail.
   INITCOMMONCONTROLSEX InitCtrls;
   InitCtrls.dwSize = sizeof(InitCtrls);
   // Set this to include all the common control classes you want to use
   // in your application.
   InitCtrls.dwICC = ICC_WIN95_CLASSES;
   InitCommonControlsEx(&InitCtrls);
   
   CWinApp::InitInstance();
   
   
   AfxEnableControlContainer();
   
   // Create the shell manager, in case the dialog contains
   // any shell tree view or shell list view controls.
   CShellManager *pShellManager = new CShellManager;

   // Activate "Windows Native" visual manager for enabling themes in MFC controls
   CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
   // Standard initialization
   // If you are not using these features and wish to reduce the size
   // of your final executable, you should remove from the following
   // the specific initialization routines you do not need
   // Change the registry key under which our settings are stored
   // TODO: You should modify this string to be something appropriate
   // such as the name of your company or organization
   SetRegistryKey(_T("Local AppWizard-Generated Applications"));
   
   CMySheet mySheet(L"Property Sheet Demo");
   CPropPage1 page1;
   CPropPage2 page2;
   
   mySheet.AddPage(&page1);
   mySheet.AddPage(&page2);
   
   m_pMainWnd = &mySheet;
   INT_PTR nResponse = mySheet.DoModal();
   if (nResponse == IDOK) {
      // TODO: Place code here to handle when the dialog is
      // dismissed with OK
   }else if (nResponse == IDCANCEL) {
      // TODO: Place code here to handle when the dialog is
      // dismissed with Cancel
   }else if (nResponse == -1) {    
      TRACE(traceAppMsg, 0, "Warning: dialog creation failed, 
        so application is terminating unexpectedly.\n");
      TRACE(traceAppMsg, 0, "Warning: if you are using MFC controls on the dialog, 
        you cannot #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n");
   }

   // Delete the shell manager created above.
   if (pShellManager != NULL) {
      delete pShellManager;
   }

   // Since the dialog has been closed, return FALSE so that we exit the
   // application, rather than start the application's message pump.
   return FALSE;
}

Шаг 9 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующее диалоговое окно. Это диалоговое окно содержит две страницы свойств.

Страницы собственности

MFC — Windows Layout

Расположение элементов управления очень важно и важно для удобства использования приложения. Он используется для организации группы элементов GUI в вашем приложении. Есть некоторые важные вещи, которые следует учитывать при выборе макета —

  • Позиции дочерних элементов.
  • Размеры дочерних элементов.

Добавление элементов управления

Давайте создадим новый основанный на диалоге проект MFC MFCLayoutDemo.

Шаг 1 — После того, как проект создан, вы увидите следующий экран.

Создать добавление элементов управления

Шаг 2 — Удалить TODO из диалогового окна.

Шаг 3 — Перетащите некоторые элементы управления из панели инструментов, которые вы видите на левой стороне.

(Мы перетащим один статический текст и один элемент управления редактированием, как показано на следующем снимке).

MFCLayoutDemo Редактировать

Шаг 4 — Измените заголовок статического текста на имя.

Статический текст в имя

Контрольная Сетка

Сетка управления — это точки сетки, которые могут помочь в расположении элементов управления, которые вы добавляете во время проектирования.

Чтобы включить сетку управления, необходимо нажать кнопку «Переключить сетку» на панели инструментов, как показано на следующем снимке.

Контрольная Сетка

Управление изменением размера

После добавления элемента управления в диалоговое окно он принимает либо его размер по умолчанию, либо размер, с которым вы его нарисовали. Чтобы помочь с размерами элементов управления в форме или диалоговом окне, Visual Studio предоставляет визуальную сетку из черных точек.

Чтобы изменить размер элемента управления, то есть присвоить ему определенную ширину или высоту, поместите мышь на одну из ручек и перетащите ее в нужном направлении.

Control Resizing

Теперь вы можете изменить размеры элементов управления с помощью этой пунктирной сетки.

Позиции управления

Элементы управления, которые вы размещаете в диалоговом окне или форме, занимают свое место. В большинстве случаев эти позиции не практичны. Вы можете переместить их в любую позицию по вашему выбору.

Давайте добавим еще несколько элементов управления —

Положение управления

Шаг 1 — Чтобы переместить элемент управления, щелкните и перетащите его в нужном направлении, пока он не достигнет предполагаемого положения.

Шаг 2 — Чтобы переместить группу элементов управления, сначала выберите их. Затем перетащите выделенную область в нужное место. Давайте выберем статические тексты и элементы управления редактирования.

Статические тексты и элементы управления редактированием

Шаг 3 — Переместите эти выбранные элементы управления в левую сторону.

Переместить выделенный контроль

Переместить выделенный контроль

Чтобы помочь с позиционированием элементов управления, Visual Studio предоставляет панель инструментов диалогового окна со следующими кнопками.

Контрольная позиция 5

Шаг 1 — Давайте выровняем элементы управления Check box и Static Text по левому краю, выбрав все эти элементы управления.

Выровнять формат

Шаг 2 — Выберите Формат → Выровнять → Левые.

Выровнять по левому краю

Шаг 3 — Теперь вы можете видеть, что все эти элементы управления выровнены влево.

Tab Tabing

Элементы управления, которые вы добавляете в форму или диалоговое окно, располагаются в последовательности, которая соответствует порядку их добавления. Когда вы добавляете элементы управления независимо от секции или области, в которую вы помещаете новый элемент управления, он последовательно размещается в конце существующих элементов управления. Если вы не исправите это, пользователю будет трудно перемещаться по элементам управления. Последовательность элементов управления навигацией также известна как порядок вкладок.

Чтобы изменить вкладку, вы можете использовать опцию меню «Формат → Порядок вкладок» или комбинацию клавиш Ctrl + D. Давайте нажмем Ctrl + D.

Tab Tabing

Теперь вы можете видеть порядок, в котором все эти элементы управления добавляются в это диалоговое окно. Чтобы изменить порядок или последовательность элементов управления, щелкните все элементы управления в той последовательности, в которой вы хотите перемещаться.

В этом примере мы сначала установим флажок, а затем элементы управления Редактирование имени и адреса. Затем нажмите OK и Отмена, как показано на следующем снимке.

Заказ столика

Давайте запустим это приложение, и вы увидите следующий вывод.

Результат заказа вкладки

МФЦ — Управление Контролями

В приложениях MFC, после визуального добавления элемента управления в ваше приложение, если вы хотите сослаться на него в своем коде, вы можете объявить переменную, основанную на этом элементе управления или связанную с ним. Библиотека MFC позволяет объявлять два типа переменных для некоторых элементов управления, используемых в приложении, как значение или переменную элемента управления.

  • Одна переменная используется для информации, хранящейся в элементе управления, который также известен как переменная / экземпляр элемента управления .

  • Другая переменная известна как переменная контрольного значения . Пользователь может выполнять какие-либо действия над этим элементом управления с этой переменной.

Одна переменная используется для информации, хранящейся в элементе управления, который также известен как переменная / экземпляр элемента управления .

Другая переменная известна как переменная контрольного значения . Пользователь может выполнять какие-либо действия над этим элементом управления с этой переменной.

Переменная управления / Экземпляр

Управляющая переменная — это переменная, основанная на классе, который управляет элементом управления. Например, управление кнопками основано на классе CButton.

Чтобы увидеть эти концепции в реальном программировании, давайте создадим проект MFCControlManagement на основе диалога MFC.

MFCControlManagement

После создания проекта вы увидите следующее диалоговое окно в окне дизайнера.

MFCControlManagement создан

Шаг 1 — Удалите строку TODO и перетащите один флажок и один элемент управления Edit, как показано на следующем снимке. Измените заголовок флажка на Включить контроль.

Изменить заголовок

Шаг 2 — Щелкните правой кнопкой мыши по флажку.

Флажок MFCControlManagement

Шаг 3 — Выберите Добавить переменную.

Шаг 4 — Теперь вы можете увидеть мастер добавления переменных участников.

Добавить переменную участника

Вы можете выбрать различные параметры в этом диалоговом окне. Для флажка тип переменной — CButton. Он выбран по умолчанию в этом диалоговом окне.

Аналогично, идентификатор элемента управления также выбран по умолчанию, теперь нам нужно выбрать элемент управления в поле со списком «Категория» и ввести m_enableDisableCheck в поле редактирования «Имя переменной» и нажать «Готово».

Шаг 5. Аналогичным образом добавьте переменную элемента управления «Изменить» с настройками, как показано на следующем снимке.

Переменные управления6

Соблюдайте заголовочный файл класса диалога. Вы можете видеть, что новые переменные были добавлены сейчас.

CButton m_enableDisableCheck;
CEdit m_myEditControl;

Переменная контрольного значения

Другой тип переменной, который вы можете объявить для элемента управления, — это значение переменной. Не все элементы управления предоставляют переменную значения.

  • Переменная value должна иметь возможность обрабатывать тип значения, хранящегося в элементе управления, к которому она предназначена.

  • Например, поскольку для обработки текста используется текстовый элемент управления, вы можете объявить для него текстовый тип данных. Обычно это переменная CString.

Переменная value должна иметь возможность обрабатывать тип значения, хранящегося в элементе управления, к которому она предназначена.

Например, поскольку для обработки текста используется текстовый элемент управления, вы можете объявить для него текстовый тип данных. Обычно это переменная CString.

Давайте посмотрим на этот тип переменной для флажка и редактирования управления.

Шаг 1 — Щелкните правой кнопкой мыши по флажку и выберите Добавить переменную.

Добавить переменную

Шаг 2 — тип переменной BOOL. Выберите Value из выпадающего списка Category.

Шаг 3 — Нажмите Готово, чтобы продолжить.

Шаг 4. Аналогичным образом добавьте значение Variable для элемента управления Edit с настройками, как показано на следующем снимке.

Переменные значения

Шаг 5 — Введите CString в типе переменной и m_editControlVal в поле имени переменной.

Шаг 6 — Теперь вы можете увидеть эти переменные, добавленные в заголовочный файл.

bool m_enableDisableVal;
CString m_editControlVal;

Управляет обработчиками событий

После добавления элемента управления в ваше приложение, независимо от того, визуально вы добавили его или создали динамически, вы также решите, как обрабатывать возможные действия, которые пользователь может выполнять над элементом управления.

  • Для диалоговых окон проекта, которые уже связаны с классом, вы можете воспользоваться некоторыми сочетаниями клавиш при создании обработчиков событий.

  • Вы можете быстро создать обработчик либо для события уведомления управления по умолчанию, либо для любого применимого сообщения Windows.

Для диалоговых окон проекта, которые уже связаны с классом, вы можете воспользоваться некоторыми сочетаниями клавиш при создании обработчиков событий.

Вы можете быстро создать обработчик либо для события уведомления управления по умолчанию, либо для любого применимого сообщения Windows.

Давайте посмотрим на тот же пример, в котором мы добавили обработчик событий для флажка.

Шаг 1 — Щелкните правой кнопкой мыши элемент управления, для которого вы хотите обработать событие уведомления.

Обработчик событий1

Шаг 2 — В контекстном меню выберите Добавить обработчик событий, чтобы открыть мастер обработки событий.

Мастер обработки событий

Шаг 3 — Выберите событие в поле Тип сообщения, чтобы добавить его к классу, выбранному в поле Список классов.

Шаг 4 — Примите имя по умолчанию в поле Имя обработчика функций или укажите имя по вашему выбору.

Шаг 5 — Нажмите Добавить и изменить, чтобы добавить обработчик событий.

Шаг 6 — Теперь вы можете увидеть следующее событие, добавленное в конец файла CMFCControlManagementDlg.cpp.

void CMFCControlManagementDlg::OnBnClickedCheck1() {
   // TODO: Add your control notification handler code here
}

Управление управления

До сих пор мы видели, как добавить элементы управления в приложение. Теперь мы увидим, как управлять этими элементами управления в соответствии с требованиями пользователя. Мы можем использовать управляющую переменную / экземпляр в конкретном обработчике событий.

Шаг 1 — Давайте посмотрим на следующий пример. Здесь мы включим / отключим контроль редактирования, когда флажок установлен / снят.

Шаг 2 — Мы добавили обработчик события щелчка флажка. Вот реализация —

void CMFCControlManagementDlg::OnBnClickedCheck1() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   if (m_enableDisableVal)
      m_myEditControl.EnableWindow(TRUE);
   else
      m_myEditControl.EnableWindow(FALSE);
}

Шаг 3 — Когда диалоговое окно создано, нам нужно добавить следующий код в CMFCControlManagementDlg :: OnInitDialog (). Это будет управлять этими элементами управления.

UpdateData(TRUE);
if (m_enableDisableVal)
   m_myEditControl.EnableWindow(TRUE);
else
   m_myEditControl.EnableWindow(FALSE);

Шаг 4 — Вот полная реализация файла CMFCControlManagementDlg.cpp.

// MFCControlManagementDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MFCControlManagement.h"
#include "MFCControlManagementDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx {
   public:
      CAboutDlg();
	
   // Dialog Data
   #ifdef AFX_DESIGN_TIME
      enum { IDD = IDD_ABOUTBOX };
   #endif

   protected:
      virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
      
   // Implementation
   protected:
      DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) {

}
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
   CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

// CMFCControlManagementDlg dialog


CMFCControlManagementDlg::CMFCControlManagementDlg(CWnd* pParent /* = NULL*/)
   :CDialogEx(IDD_MFCCONTROLMANAGEMENT_DIALOG, pParent) , 
   m_enableDisableVal(FALSE) , m_editControlVal(_T("")) {
   m_hIcon = AfxGetApp()&rarr LoadIcon(IDR_MAINFRAME);
}

void CMFCControlManagementDlg::DoDataExchange(CDataExchange* pDX) {
   CDialogEx::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_CHECK1, m_enableDisableCheck);
   DDX_Control(pDX, IDC_EDIT1, m_myEditControl);
   DDX_Check(pDX, IDC_CHECK1, m_enableDisableVal);
   DDX_Text(pDX, IDC_EDIT1, m_editControlVal);
}
BEGIN_MESSAGE_MAP(CMFCControlManagementDlg, CDialogEx)
   ON_WM_SYSCOMMAND()
   ON_WM_PAINT()
   ON_WM_QUERYDRAGICON()
   ON_BN_CLICKED(IDC_CHECK1, &CMFCControlManagementDlg::OnBnClickedCheck1)
END_MESSAGE_MAP()

// CMFCControlManagementDlg message handlers

BOOL CMFCControlManagementDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
      
   // Add "About..." menu item to system menu.
   // IDM_ABOUTBOX must be in the system command range.
   ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
   ASSERT(IDM_ABOUTBOX < 0xF000);
      
   CMenu* pSysMenu = GetSystemMenu(FALSE);
   if (pSysMenu != NULL) {
      BOOL bNameValid;
      CString strAboutMenu;
      bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
      ASSERT(bNameValid);
      if (!strAboutMenu.IsEmpty()) {
         pSysMenu  AppendMenu(MF_SEPARATOR);
         pSysMenu  AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
      }
   }
	
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);        // Set big icon
   SetIcon(m_hIcon, FALSE);       // Set small icon

   // TODO: Add extra initialization here
   UpdateData(TRUE);
   if (m_enableDisableVal)
      m_myEditControl.EnableWindow(TRUE);
   else
      m_myEditControl.EnableWindow(FALSE);
   return TRUE; // return TRUE unless you set the focus to a control
}
void CMFCControlManagementDlg::OnSysCommand(UINT nID, LPARAM lParam) {
   if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
      CAboutDlg dlgAbout;
      dlgAbout.DoModal();
   }else {
      CDialogEx::OnSysCommand(nID, lParam);
   }
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CMFCControlManagementDlg::OnPaint() {
   if (IsIconic()) {
      CPaintDC dc(this); // device context for painting
      
      SendMessage(WM_ICONERASEBKGND,
         reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
			
      // Center icon in client rectangle
      int cxIcon = GetSystemMetrics(SM_CXICON);
      int cyIcon = GetSystemMetrics(SM_CYICON);
      CRect rect;
      GetClientRect(&rect);
      int x = (rect.Width() - cxIcon + 1) / 2;
      int y = (rect.Height() - cyIcon + 1) / 2;
		
      // Draw the icon
      dc.DrawIcon(x, y, m_hIcon);
   }else {
      CDialogEx::OnPaint();
   }
}

// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMFCControlManagementDlg::OnQueryDragIcon() {
   return static_cast<HCURSOR>(m_hIcon);
}

void CMFCControlManagementDlg::OnBnClickedCheck1() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   if (m_enableDisableVal)
      m_myEditControl.EnableWindow(TRUE);
   else
      m_myEditControl.EnableWindow(FALSE);
}

Шаг 5 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод. По умолчанию флажок снят. Это также отключает контроль редактирования.

Управление управления

Шаг 6 — Установите флажок Включить контроль. Это автоматически активирует контроль редактирования.

Контроль управления

MFC — Windows Control

Элементы управления Windows — это объекты, с которыми пользователи могут взаимодействовать для ввода или манипулирования данными. Они обычно появляются в диалоговых окнах или на панелях инструментов. Существуют различные типы элементов управления —

  • Элемент управления на основе текста, который используется для отображения текста пользователю или запроса текста от пользователя.

  • Элемент управления на основе списка отображает список элементов.

  • Элемент управления на основе прогресса используется, чтобы показать ход действия.

  • Статический элемент управления может использоваться для отображения цветов, рисунка или чего-либо, что не всегда вписывается в вышеуказанные категории.

Элемент управления на основе текста, который используется для отображения текста пользователю или запроса текста от пользователя.

Элемент управления на основе списка отображает список элементов.

Элемент управления на основе прогресса используется, чтобы показать ход действия.

Статический элемент управления может использоваться для отображения цветов, рисунка или чего-либо, что не всегда вписывается в вышеуказанные категории.

Sr.No. Управление и описание
1 Статический контроль

Статический элемент управления — это объект, который отображает информацию для пользователя без его или ее прямого вмешательства. Его можно использовать для отображения цветов, геометрической формы или изображения, такого как значок, растровое изображение или анимация.

2 Управление анимацией

Элемент управления анимацией — это окно, в котором отображается аудиоклип в формате AVI. AVI-клип — это серия растровых кадров, как в фильме. Элементы управления анимацией могут воспроизводить только простые AVI-клипы, и они не поддерживают звук. Он представлен классом CAnimateCtrl .

3 кнопка

Кнопка — это объект, который пользователь щелкает, чтобы инициировать действие. Кнопочное управление представлено классом CButton .

4 Кнопка растрового изображения

Кнопка растрового изображения отображает изображение или рисунок и текст на его лице. Обычно это делается для того, чтобы сделать кнопку немного явной. Кнопка растрового изображения создается с использованием класса CBitmapButton , производного от CButton.

5 Командная кнопка

Командная кнопка — это расширенная версия обычной кнопки. Слева отображается зеленая иконка со стрелкой, за которой следует подпись обычного размера. Под основной подписью он может отображать другую меньшую подпись, которая служит подсказкой для предоставления дополнительной информации.

6 Статический текст

Статический элемент управления отображает текстовую строку, поле, прямоугольник, значок, курсор, растровое изображение или расширенный метафайл. Он представлен классом CStatic . Его можно использовать для маркировки, маркировки или разделения других элементов управления. Статический контроль обычно не требует ввода и не обеспечивает вывода.

7 Список

В окне списка отображается список элементов, таких как имена файлов, которые пользователь может просматривать и выбирать. Поле списка представлено классом CListBox . В окне списка с одним выбором пользователь может выбрать только один элемент. В окне списка с множественным выбором можно выбрать диапазон элементов. Когда пользователь выбирает элемент, он выделяется, и окно списка отправляет уведомление в родительское окно.

8 Комбинированные коробки

Поле со списком состоит из списка в сочетании со статическим элементом управления или элементом редактирования. он представлен классом CComboBox . Часть списка элемента управления может отображаться постоянно или может выпадать только тогда, когда пользователь выбирает стрелку раскрывающегося списка рядом с элементом управления.

9 Радио-кнопки

Переключатель — это элемент управления, который отображается в виде точки, окруженной круглой рамкой. В действительности радиокнопка сопровождается одной или несколькими другими радиокнопками, которые появляются и ведут себя как группа.

10 Флажки

Флажок — это элемент управления Windows, который позволяет пользователю устанавливать или изменять значение элемента как true или false.

11 Списки изображений

Список изображений представляет собой коллекцию изображений одинакового размера, каждое из которых может быть указано по нулевому индексу. Списки изображений используются для эффективного управления большими наборами значков или растровых изображений. Списки изображений представлены классом CImageList .

12 Редактировать окно

Поле редактирования — это прямоугольное дочернее окно, в которое пользователь может вводить текст. Он представлен классом CEdit .

13 Rich Edit

Rich Edit Control — это окно, в которое пользователь может вводить и редактировать текст. Тексту может быть назначено форматирование символов и абзацев, и он может включать встроенные объекты OLE. Он представлен классом CRichEditCtrl .

14 Групповая коробка

Групповое поле — это статический элемент управления, используемый для установки видимой или программной группы элементов управления. Элемент управления представляет собой прямоугольник, который группирует другие элементы управления вместе.

15 Spin Button

Элемент управления Spin Button (также известный как элемент управления «вверх-вниз») представляет собой пару кнопок со стрелками, которые пользователь может нажимать для увеличения или уменьшения значения, например положения прокрутки или числа, отображаемого в сопутствующем элементе управления. он представлен классом CSpinButtonCtrl .

16 Управление элементом управления обновлением

Он управляет средствами управления обновлением.

17 Контроль прогресса

Элемент управления индикатора выполнения — это окно, которое приложение может использовать для индикации хода выполнения длительной операции. Он состоит из прямоугольника, который постепенно заполняется слева направо цветом системы при выполнении операции. Он представлен классом CProgressCtrl .

18 Прогресс Бары

Индикаторы выполнения — это окно, которое приложение может использовать для индикации хода выполнения операции.

19 таймер

Таймер — это непространственный объект, который использует повторяющиеся промежутки времени с компьютера или из вашего приложения. Чтобы работать, каждый промежуток времени, элемент управления отправляет сообщение операционной системе. В отличие от большинства других элементов управления, таймер MFC не имеет ни кнопки для его представления, ни класса. Чтобы создать таймер, вы просто вызываете метод CWnd :: SetTimer (). Этот вызов функции создает таймер для вашего приложения. Как и другие элементы управления, таймер использует идентификатор.

20 Выбор даты и времени

Элемент управления выбора даты и времени ( CDateTimeCtrl ) реализует интуитивно понятный и узнаваемый способ ввода или выбора конкретной даты. Основной интерфейс управления похож по функциональности на поле со списком. Однако если пользователь расширяет элемент управления, появляется элемент управления календаря месяца (по умолчанию), позволяющий пользователю указать конкретную дату. Когда дата выбрана, элемент управления календаря автоматически исчезает.

21 Картина

Если вам нужно отобразить изображение для вашего приложения, Visual C ++ предоставляет специальный элемент управления для этой цели.

22 Редактор изображений

Редактор изображений содержит обширный набор инструментов для создания и редактирования изображений, а также функции, помогающие создавать растровые изображения панели инструментов. Помимо растровых изображений, значков и курсоров, вы можете редактировать изображения в формате GIF или JPEG, используя команды в меню «Изображение» и инструменты на панели инструментов «Редактор изображений».

23 Ползунок управления

Ползунок управления (также известный как трекбар) представляет собой окно, содержащее ползунок и дополнительные отметки. Когда пользователь перемещает ползунок с помощью мыши или клавиш со стрелками, элемент управления отправляет уведомления с уведомлением об изменении. Есть два типа слайдеров — горизонтальные и вертикальные. Он представлен классом CSliderCtrl .

24 Scrollbars

Полоса прокрутки — это графический элемент управления, с помощью которого непрерывный текст, изображения или что-либо еще можно прокручивать в двух направлениях вдоль элемента управления, щелкая стрелку. Этот элемент управления может принимать одно из двух направлений — горизонтальное или вертикальное. Он представлен классом CScrollBar .

25 Управление Деревом

Элемент управления Tree View — это окно, которое отображает иерархический список элементов, таких как заголовки в документе, записи в индексе или файлы и каталоги на диске. Каждый элемент состоит из метки и необязательного растрового изображения, и каждый элемент может иметь список связанных с ним подпунктов. Нажав на элемент, пользователь может развернуть и свернуть связанный список подэлементов. Он представлен классом CTreeCtrl .

26 Управление списком

Инкапсулирует функциональность элемента управления представления списка, который отображает коллекцию элементов, каждый из которых состоит из значка (из списка изображений) и метки. Он представлен классом CListCtrl . Элемент управления списком состоит из использования одного из четырех представлений для отображения списка элементов.

Статический элемент управления — это объект, который отображает информацию для пользователя без его или ее прямого вмешательства. Его можно использовать для отображения цветов, геометрической формы или изображения, такого как значок, растровое изображение или анимация.

Элемент управления анимацией — это окно, в котором отображается аудиоклип в формате AVI. AVI-клип — это серия растровых кадров, как в фильме. Элементы управления анимацией могут воспроизводить только простые AVI-клипы, и они не поддерживают звук. Он представлен классом CAnimateCtrl .

Кнопка — это объект, который пользователь щелкает, чтобы инициировать действие. Кнопочное управление представлено классом CButton .

Кнопка растрового изображения отображает изображение или рисунок и текст на его лице. Обычно это делается для того, чтобы сделать кнопку немного явной. Кнопка растрового изображения создается с использованием класса CBitmapButton , производного от CButton.

Командная кнопка — это расширенная версия обычной кнопки. Слева отображается зеленая иконка со стрелкой, за которой следует подпись обычного размера. Под основной подписью он может отображать другую меньшую подпись, которая служит подсказкой для предоставления дополнительной информации.

Статический элемент управления отображает текстовую строку, поле, прямоугольник, значок, курсор, растровое изображение или расширенный метафайл. Он представлен классом CStatic . Его можно использовать для маркировки, маркировки или разделения других элементов управления. Статический контроль обычно не требует ввода и не обеспечивает вывода.

В окне списка отображается список элементов, таких как имена файлов, которые пользователь может просматривать и выбирать. Поле списка представлено классом CListBox . В окне списка с одним выбором пользователь может выбрать только один элемент. В окне списка с множественным выбором можно выбрать диапазон элементов. Когда пользователь выбирает элемент, он выделяется, и окно списка отправляет уведомление в родительское окно.

Поле со списком состоит из списка в сочетании со статическим элементом управления или элементом редактирования. он представлен классом CComboBox . Часть списка элемента управления может отображаться постоянно или может выпадать только тогда, когда пользователь выбирает стрелку раскрывающегося списка рядом с элементом управления.

Переключатель — это элемент управления, который отображается в виде точки, окруженной круглой рамкой. В действительности радиокнопка сопровождается одной или несколькими другими радиокнопками, которые появляются и ведут себя как группа.

Флажок — это элемент управления Windows, который позволяет пользователю устанавливать или изменять значение элемента как true или false.

Список изображений представляет собой коллекцию изображений одинакового размера, каждое из которых может быть указано по нулевому индексу. Списки изображений используются для эффективного управления большими наборами значков или растровых изображений. Списки изображений представлены классом CImageList .

Поле редактирования — это прямоугольное дочернее окно, в которое пользователь может вводить текст. Он представлен классом CEdit .

Rich Edit Control — это окно, в которое пользователь может вводить и редактировать текст. Тексту может быть назначено форматирование символов и абзацев, и он может включать встроенные объекты OLE. Он представлен классом CRichEditCtrl .

Групповое поле — это статический элемент управления, используемый для установки видимой или программной группы элементов управления. Элемент управления представляет собой прямоугольник, который группирует другие элементы управления вместе.

Элемент управления Spin Button (также известный как элемент управления «вверх-вниз») представляет собой пару кнопок со стрелками, которые пользователь может нажимать для увеличения или уменьшения значения, например положения прокрутки или числа, отображаемого в сопутствующем элементе управления. он представлен классом CSpinButtonCtrl .

Он управляет средствами управления обновлением.

Элемент управления индикатора выполнения — это окно, которое приложение может использовать для индикации хода выполнения длительной операции. Он состоит из прямоугольника, который постепенно заполняется слева направо цветом системы при выполнении операции. Он представлен классом CProgressCtrl .

Индикаторы выполнения — это окно, которое приложение может использовать для индикации хода выполнения операции.

Таймер — это непространственный объект, который использует повторяющиеся промежутки времени с компьютера или из вашего приложения. Чтобы работать, каждый промежуток времени, элемент управления отправляет сообщение операционной системе. В отличие от большинства других элементов управления, таймер MFC не имеет ни кнопки для его представления, ни класса. Чтобы создать таймер, вы просто вызываете метод CWnd :: SetTimer (). Этот вызов функции создает таймер для вашего приложения. Как и другие элементы управления, таймер использует идентификатор.

Элемент управления выбора даты и времени ( CDateTimeCtrl ) реализует интуитивно понятный и узнаваемый способ ввода или выбора конкретной даты. Основной интерфейс управления похож по функциональности на поле со списком. Однако если пользователь расширяет элемент управления, появляется элемент управления календаря месяца (по умолчанию), позволяющий пользователю указать конкретную дату. Когда дата выбрана, элемент управления календаря автоматически исчезает.

Если вам нужно отобразить изображение для вашего приложения, Visual C ++ предоставляет специальный элемент управления для этой цели.

Редактор изображений содержит обширный набор инструментов для создания и редактирования изображений, а также функции, помогающие создавать растровые изображения панели инструментов. Помимо растровых изображений, значков и курсоров, вы можете редактировать изображения в формате GIF или JPEG, используя команды в меню «Изображение» и инструменты на панели инструментов «Редактор изображений».

Ползунок управления (также известный как трекбар) представляет собой окно, содержащее ползунок и дополнительные отметки. Когда пользователь перемещает ползунок с помощью мыши или клавиш со стрелками, элемент управления отправляет уведомления с уведомлением об изменении. Есть два типа слайдеров — горизонтальные и вертикальные. Он представлен классом CSliderCtrl .

Полоса прокрутки — это графический элемент управления, с помощью которого непрерывный текст, изображения или что-либо еще можно прокручивать в двух направлениях вдоль элемента управления, щелкая стрелку. Этот элемент управления может принимать одно из двух направлений — горизонтальное или вертикальное. Он представлен классом CScrollBar .

Элемент управления Tree View — это окно, которое отображает иерархический список элементов, таких как заголовки в документе, записи в индексе или файлы и каталоги на диске. Каждый элемент состоит из метки и необязательного растрового изображения, и каждый элемент может иметь список связанных с ним подпунктов. Нажав на элемент, пользователь может развернуть и свернуть связанный список подэлементов. Он представлен классом CTreeCtrl .

Инкапсулирует функциональность элемента управления представления списка, который отображает коллекцию элементов, каждый из которых состоит из значка (из списка изображений) и метки. Он представлен классом CListCtrl . Элемент управления списком состоит из использования одного из четырех представлений для отображения списка элементов.

MFC — Сообщения и События

Приложение состоит из различных объектов. В большинстве случаев на компьютере работает несколько приложений, и операционной системе постоянно предлагается выполнить некоторые задания. Поскольку может быть непредсказуемо представлено так много запросов, операционная система оставляет объектам право определять, что они хотят, когда они этого хотят, и какое поведение или результат они ожидают.

обзор

  • Операционная система Microsoft Windows не может предсказать, о каких типах запросов нужно было бы позаботиться одному объекту, и о каком типе назначения понадобился бы другой объект.

  • Чтобы управлять всеми этими назначениями и запросами, объекты отправляют сообщения.

  • Каждый объект несет ответственность за решение, какое сообщение отправлять и когда.

  • Чтобы отправить сообщение, элемент управления должен создать событие.

  • Чтобы провести различие между ними, имя сообщения обычно начинается с WM_, что означает Window Message.

  • Название события обычно начинается с Вкл., Что указывает на действие.

  • Событие — это действие отправки сообщения.

Операционная система Microsoft Windows не может предсказать, о каких типах запросов нужно было бы позаботиться одному объекту, и о каком типе назначения понадобился бы другой объект.

Чтобы управлять всеми этими назначениями и запросами, объекты отправляют сообщения.

Каждый объект несет ответственность за решение, какое сообщение отправлять и когда.

Чтобы отправить сообщение, элемент управления должен создать событие.

Чтобы провести различие между ними, имя сообщения обычно начинается с WM_, что означает Window Message.

Название события обычно начинается с Вкл., Что указывает на действие.

Событие — это действие отправки сообщения.

Карта сообщений

Поскольку Windows является операционной системой, ориентированной на сообщения, большая часть программирования для среды Windows включает обработку сообщений. Каждый раз, когда происходит событие, такое как нажатие клавиши или щелчок мыши, в приложение отправляется сообщение, которое затем должно обработать событие.

  • Чтобы компилятор управлял сообщениями, они должны быть включены в определение класса.

  • Макрос DECLARE_MESSAGE_MAP должен предоставляться в конце определения класса, как показано в следующем коде.

Чтобы компилятор управлял сообщениями, они должны быть включены в определение класса.

Макрос DECLARE_MESSAGE_MAP должен предоставляться в конце определения класса, как показано в следующем коде.

class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};
  • Фактические сообщения должны быть перечислены чуть выше строки DECLARE_MESSAGE_MAP.

  • Чтобы реализовать сообщения, вам нужно создать таблицу сообщений, которую использует ваша программа.

  • В этой таблице используются два макроса-разделителя;

  • Он начинается с BEGIN_MESSAGE_MAP и заканчивается макросами END_MESSAGE_MAP .

  • Макрос BEGIN_MESSAGE_MAP принимает два аргумента: имя вашего класса и класс MFC, из которого вы вывели свой класс, как показано в следующем коде.

Фактические сообщения должны быть перечислены чуть выше строки DECLARE_MESSAGE_MAP.

Чтобы реализовать сообщения, вам нужно создать таблицу сообщений, которую использует ваша программа.

В этой таблице используются два макроса-разделителя;

Он начинается с BEGIN_MESSAGE_MAP и заканчивается макросами END_MESSAGE_MAP .

Макрос BEGIN_MESSAGE_MAP принимает два аргумента: имя вашего класса и класс MFC, из которого вы вывели свой класс, как показано в следующем коде.

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {

   // Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
                                      CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance(){
   m_pMainWnd = new CMainFrame;
   m_pMainWnd->ShowWindow(SW_SHOW);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

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

Win32 Project

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

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

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

Шаг 4 — Нам нужно добавить новый исходный файл.

Шаг 5 — Щелкните правой кнопкой мыши по вашему проекту и выберите «Добавить» → «Новый элемент».

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

Win Project

Шаг 7 — Нажмите Добавить, чтобы продолжить.

Шаг 8 — Теперь добавьте следующий код в файл * .cpp.

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      DECLARE_MESSAGE_MAP()
};

CMainFrame::CMainFrame() {
   // Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
      CRect(120, 100, 700, 480), NULL);
}

class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance() {
   m_pMainWnd = new CMainFrame;
   m_pMainWnd->ShowWindow(SW_SHOW);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

Сообщения Windows

Существуют различные типы сообщений Windows, такие как создание окна, показ окна и т. Д. Вот некоторые из наиболее часто используемых сообщений Windows.

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

WM_CREATE — Когда создается объект, называемый окном, фрейм, который создает объекты, отправляет сообщение, обозначенное как ON_WM_CREATE .

Шаг 1 — Чтобы создать ON_WM_CREATE, добавьте afx_msg int OnCreate (LPCREATESTRUCT lpCreateStruct); перед DECLARE_MESSAGE_MAP (), как показано ниже.

class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
      DECLARE_MESSAGE_MAP()
};

Шаг 2 — Добавьте ON_WM_CREATE () после BEGIN_MESSAGE_MAP (CMainFrame, CFrameWnd) и перед END_MESSAGE_MAP ()

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()

Шаг 3 — Вот реализация OnCreate ()

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
   // Call the base class to create the window
   if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {

      // If the window was successfully created, let the user know
      MessageBox(L"The window has been created!!!");
      // Since the window was successfully created, return 0
      return 0;
   }
   // Otherwise, return -1
   return -1;
}

Шаг 4 — Теперь ваш * .cpp файл будет выглядеть так, как показано в следующем коде.

#include <afxwin.h>
class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
      DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {

   // Create the window's frame
   Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
      CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
   public:
      BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
   // Call the base class to create the window
   if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {
      // If the window was successfully created, let the user know
      MessageBox(L"The window has been created!!!");
      // Since the window was successfully created, return 0
      return 0;
   }
   // Otherwise, return -1
   return -1;
}
BOOL CMessagesApp::InitInstance() { 
   m_pMainWnd = new CMainFrame;
   m_pMainWnd -> ShowWindow(SW_SHOW);
   m_pMainWnd -> UpdateWindow();
   return TRUE;
}
CMessagesApp theApp;

Шаг 5 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Сообщение

Шаг 6 — Когда вы нажмете ОК, появится главное окно.

Сообщение

Командные сообщения

Одной из основных функций графического приложения является представление элементов управления Windows и ресурсов, которые позволяют пользователю взаимодействовать с машиной. Примерами элементов управления, которые мы изучим, являются кнопки, списки, поля со списком и т. Д.

Одним из видов ресурсов, который мы представили в предыдущем уроке, является меню. Такие элементы управления и ресурсы могут инициировать свои собственные сообщения, когда пользователь щелкает их. Сообщение, исходящее от элемента управления Windows или ресурса, называется командным сообщением.

Давайте рассмотрим простой пример командных сообщений.

Чтобы предоставить вашему приложению возможность создавать новый документ, класс CWinApp предоставляет метод OnFileNew ().

afx_msg void OnFileNew();

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_COMMAND(ID_FILE_NEW, CMainFrame::OnFileNew)
END_MESSAGE_MAP()

Вот определение метода —

void CMainFrame::OnFileNew() {
   // Create New file
}

Сообщения клавиатуры

Клавиатура — это аппаратный объект, подключенный к компьютеру. По умолчанию он используется для ввода узнаваемых символов, букв и других символов в элементе управления. Каждая клавиша на клавиатуре отображает символ, букву или их комбинацию, чтобы указать, для чего клавиша может быть использована. Пользователь обычно нажимает клавишу, которая посылает сигнал программе.

У каждого ключа есть код, который операционная система может распознать. Этот код известен как код виртуального ключа .

VK_LBUTTON

Левую кнопку мыши

VK_RBUTTON

Правая кнопка мыши

VK_CANCEL

Контроль-прерывание обработки

VK_MBUTTON

Средняя кнопка мыши (трехкнопочная мышь)

VK_BACK

Клавиша BACKSPACE

VK_RETURN

Введите ключ

VK_TAB

Клавиша TAB

VK_CLEAR

Ключ CLEAR

VK_SHIFT

Клавиша SHIFT

VK_CONTROL

Клавиша CTRL

VK_MENU

Клавиша ALT

VK_PAUSE

ПАУЗА

VK_CAPITAL

Клавиша CAPS LOCK

VK_ESCAPE

ESC ключ

VK_SPACE

ПРОБЕЛ

VK_PRIOR

СТРАНИЦА ВВЕРХ

VK_NEXT

СТРАНИЦА ВНИЗ

VK_END

Ключ END

VK_HOME

ДОМАШНИЙ ключ

VK_LEFT

Клавиша со стрелкой влево

VK_UP

Стрелка вверх

VK_RIGHT

Клавиша со стрелкой вправо

VK_DOWN

Кнопка со стрелкой вниз

VK_SELECT

ВЫБРАТЬ ключ

VK_PRINT

ПЕЧАТЬ ключ

VK_EXECUTE

Ключ ВЫПОЛНИТЬ

VK_SNAPSHOT

Ключ экрана печати

VK_INSERT

Ключ INS

VK_DELETE

Клавиша DEL

VK_NUMPAD0

Цифровая клавиатура 0 клавиш

VK_NUMPAD1

Цифровая клавиатура 1 клавиша

VK_NUMPAD2

Цифровая клавиатура 2 клавиши

VK_NUMPAD3

Цифровая клавиатура 3 клавиши

VK_NUMPAD4

Цифровая клавиатура 4 клавиши

VK_NUMPAD5

Цифровая клавиатура 5 клавиш

VK_NUMPAD6

Цифровая клавиатура 6 клавиш

VK_NUMPAD7

Цифровая клавиатура 7 клавиш

VK_NUMPAD8

Цифровая клавиатура 8 клавиш

VK_NUMPAD9

Цифровая клавиатура 9 клавиш

VK_MULTIPLY

Умножить ключ

VK_ADD

Добавить ключ

VK_SEPARATOR

Разделительный ключ

VK_SUBTRACT

Ключ вычитания

VK_DECIMAL

Десятичный ключ

VK_DIVIDE

Разделить ключ

VK_F1

Клавиша F1

VK_F2

Клавиша F2

VK_F3

Клавиша F3

VK_F4

Клавиша F4

VK_F5

Клавиша F5

VK_F6

Клавиша F6

VK_F7

Клавиша F7

VK_F8

Клавиша F8

VK_F9

Клавиша F9

VK_F10

Клавиша F10

VK_F11

Клавиша F11

VK_F12

Клавиша F12

VK_NUMLOCK

Клавиша NUM LOCK

VK_SCROLL

Кнопка SCROLL LOCK

VK_LSHIFT

Левая клавиша SHIFT

VK_RSHIFT

Правая клавиша SHIFT

VK_LCONTROL

Левая клавиша управления

VK_RCONTROL

Правая клавиша УПРАВЛЕНИЯ

Нажатие клавиши вызывает сообщение WM_KEYDOWN или WM_SYSKEYDOWN в сообщении темы . Это можно определить следующим образом:

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

Давайте посмотрим на простой пример.

Шаг 1 — Вот сообщение.

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_CREATE()
   ON_WM_KEYDOWN()
END_MESSAGE_MAP()

Шаг 2 — Вот реализация OnKeyDown ().

void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
   switch (nChar) {

      case VK_RETURN:
         MessageBox(L"You pressed Enter");
         break;
      case VK_F1:
         MessageBox(L"Help is not available at the moment");
         break;
      case VK_DELETE:
         MessageBox(L"Can't Delete This");
         break;
      default:
         MessageBox(L"Whatever");
   }
}

Шаг 3 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Окно сообщений

Шаг 4 — Когда вы нажмете Enter, появится следующее сообщение.

Вывод сообщения

Сообщения мыши

Мышь — это еще один объект, прикрепленный к компьютеру, позволяющий пользователю взаимодействовать с машиной.

  • Если была нажата левая кнопка мыши, отправляется сообщение ON_WM_LBUTTONDOWN. Синтаксис этого сообщения —

    • afx_msg void OnLButtonDown (UINT nFlags, точка CPoint)

  • Если была нажата правая кнопка мыши, отправляется сообщение ON_WM_RBUTTONDOWN. Его синтаксис —

    • afx_msg void OnRButtonDown (UINT nFlags, точка CPoint)

  • Аналогичным образом, если отпустить левую мышь, отправляется сообщение ON_WM_LBUTTONUP. Его синтаксис —

    • afx_msg void OnLButtonUp (UINT nFlags, точка CPoint)

  • Если правая мышь отпускается, отправляется сообщение ON_WM_TBUTTONUP. Его синтаксис —

    • afx_msg void OnRButtonUp (UINT nFlags, точка CPoint)

Если была нажата левая кнопка мыши, отправляется сообщение ON_WM_LBUTTONDOWN. Синтаксис этого сообщения —

afx_msg void OnLButtonDown (UINT nFlags, точка CPoint)

Если была нажата правая кнопка мыши, отправляется сообщение ON_WM_RBUTTONDOWN. Его синтаксис —

afx_msg void OnRButtonDown (UINT nFlags, точка CPoint)

Аналогичным образом, если отпустить левую мышь, отправляется сообщение ON_WM_LBUTTONUP. Его синтаксис —

afx_msg void OnLButtonUp (UINT nFlags, точка CPoint)

Если правая мышь отпускается, отправляется сообщение ON_WM_TBUTTONUP. Его синтаксис —

afx_msg void OnRButtonUp (UINT nFlags, точка CPoint)

Давайте посмотрим на простой пример.

Шаг 1 — Добавьте следующие две функции в определение класса CMainFrame, как показано в следующем коде.

class CMainFrame : public CFrameWnd {
   public:
      CMainFrame();
   protected:
      afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
      afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
      afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
      DECLARE_MESSAGE_MAP()
};

Шаг 2 — Добавьте следующие две Карты сообщений.

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   ON_WM_KEYDOWN()
   ON_WM_LBUTTONDOWN()
   ON_WM_RBUTTONUP()
END_MESSAGE_MAP()

Шаг 3 — Вот определение функций.

void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { 
   CString MsgCoord;
   MsgCoord.Format(L"Left Button at P(%d, %d)", point.x, point.y);
   MessageBox(MsgCoord);
}
void CMainFrame::OnRButtonUp(UINT nFlags, CPoint point) { 
   MessageBox(L"Right Mouse Button Up");
}

Шаг 4 — Когда вы запустите это приложение, вы увидите следующий вывод.

Сообщения мыши

Шаг 5 — Когда вы нажмете ОК, вы увидите следующее сообщение.

Сообщения мыши

Шаг 6 — Щелкните правой кнопкой мыши на этом окне. Теперь, когда вы отпустите правую кнопку мыши, на ней отобразится следующее сообщение.

Сообщения мыши

MFC — Activex Control

Контейнер элемента управления ActiveX — это родительская программа, которая предоставляет среду для запуска элемента управления ActiveX (ранее OLE).

  • Элемент управления ActiveX — это элемент управления, использующий технологии Microsoft ActiveX.

  • ActiveX — это не язык программирования, а набор правил для обмена информацией между приложениями.

  • Программисты могут разрабатывать элементы управления ActiveX на разных языках, включая C, C ++, Visual Basic и Java.

  • Вы можете создать приложение, способное содержать элементы управления ActiveX с или без MFC, но это гораздо проще сделать с MFC.

Элемент управления ActiveX — это элемент управления, использующий технологии Microsoft ActiveX.

ActiveX — это не язык программирования, а набор правил для обмена информацией между приложениями.

Программисты могут разрабатывать элементы управления ActiveX на разных языках, включая C, C ++, Visual Basic и Java.

Вы можете создать приложение, способное содержать элементы управления ActiveX с или без MFC, но это гораздо проще сделать с MFC.

Давайте рассмотрим простой пример добавления элементов управления ActiveX в ваше приложение на основе диалогового окна MFC.

Шаг 1 — Щелкните правой кнопкой мыши диалоговое окно в окне дизайнера и выберите «Вставить элемент управления ActiveX».

Вставить элемент управления Activex

Шаг 2. Выберите элемент управления Microsoft Picture Clip и нажмите кнопку «ОК».

Microsoft Picture Control

Шаг 3 — Измените размер элемента управления рисунком и в окне «Свойства» щелкните поле «Изображение».

Шаг 4 — Просмотрите папку, которая содержит картинки. Выберите любую картинку.

Шаг 5 — Когда вы запустите это приложение, вы увидите следующий вывод.

Вставить Activex

Давайте посмотрим на другой простой пример.

Шаг 1 — Щелкните правой кнопкой мыши диалоговое окно в окне дизайнера.

Дизайнерское окно

Шаг 2 — Выберите Вставить элемент управления ActiveX.

Дизайнерское окно

Шаг 3 — Выберите Microsoft ProgressBar Control 6.0, нажмите ОК.

Шаг 4 — Выберите индикатор выполнения и установите его ориентацию в окне свойств на 1 — ccOrientationVertical .

Шаг 5 — Добавьте управляющую переменную для индикатора выполнения.

Дизайнерское окно

Шаг 6 — Добавьте следующий код в OnInitDialog ()

m_progBarCtrl.SetScrollRange(0,100,TRUE);
m_progBarCtrl.put_Value(53);

Шаг 7 — Когда вы снова запустите это приложение, вы увидите индикатор выполнения также в вертикальном направлении.

Дизайнерское окно

MFC — Файловая система

В этой главе мы обсудим различные компоненты файловой системы.

приводы

Диск — это физическое устройство, подключенное к компьютеру, чтобы хранить информацию. Логический диск, логический том или виртуальный диск (сокращенно VD или vdisk) — это виртуальное устройство, которое предоставляет область полезной емкости на одном или нескольких физических дисках в компьютерной системе. Накопитель может быть жестким диском, CD-ROM, DVD-ROM, флэш-накопителем (USB), картой памяти и т. Д.

Одной из основных операций, которую вы хотите выполнить, является получение списка дисков на компьютере.

Давайте рассмотрим простой пример, создав новое приложение на основе диалогового окна MFC.

Шаг 1 — Перетащите одну кнопку из панели инструментов, измените ее заголовок на Get Drives Info.

Шаг 2 — Удалите заголовок Статический элемент управления (строка TODO) и измените его ID на IDC_STATIC_TEXT.

Статическая подпись

Шаг 3 — Щелкните правой кнопкой мыши на кнопке и выберите «Добавить обработчик событий».

Статическая подпись

Шаг 4 — Выберите тип сообщения BN_CLICKED и нажмите кнопку «Добавить и изменить».

Шаг 5 — Добавьте переменную значения m_strDrives для элемента управления Static Text.

Статическая подпись

Для поддержки дисков на компьютере библиотека Win32 предоставляет функцию GetLogicalDrives () Microsoft Window, которая извлекает список всех дисков на текущем компьютере.

Шаг 6 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Статическая подпись

Шаг 7 — Когда вы нажимаете кнопку, вы можете увидеть все диски на вашем компьютере.

Статическая подпись

Справочники

В вычислительной технике каталог — это структура каталогизации файловой системы, которая содержит ссылки на другие компьютерные файлы и, возможно, другие каталоги. Каталог — это физическое местоположение. Он может обрабатывать операции, недоступные на диске.

Давайте рассмотрим простой пример, создав новое приложение на основе диалогового окна MFC.

Шаг 1 — Перетащите три кнопки из панели инструментов. Измените их подписи, чтобы создать каталог, удалить каталог и переместить каталог.

Шаг 2 — Измените идентификаторы этих кнопок на IDC_BUTTON_CREATE , IDC_BUTTON_DELETE и IDC_BUTTON_MOVE .

Шаг 3 — Удалить строку TODO.

Справочники

Шаг 4 — Добавьте обработчик событий для каждой кнопки.

Шаг 5 — Чтобы создать каталог, вы можете вызвать метод CreateDirectory () библиотеки Win32.

Шаг 6 — Вот реализация реализации обработчика событий кнопки «Создать», в которой мы создадим один каталог, а затем еще два подкаталога.

void CMFCDirectoriesDemoDlg::OnBnClickedButtonCreate() {
   // TODO: Add your control notification handler code here
   SECURITY_ATTRIBUTES saPermissions;

   saPermissions.nLength = sizeof(SECURITY_ATTRIBUTES);
   saPermissions.lpSecurityDescriptor = NULL;
   saPermissions.bInheritHandle = TRUE;

   if (CreateDirectory(L"D:\\MFCDirectoryDEMO", &saPermissions) == TRUE)
      AfxMessageBox(L"The directory was created.");
   CreateDirectory(L"D:\\MFCDirectoryDEMO\\Dir1", NULL);
   CreateDirectory(L"D:\\MFCDirectoryDEMO\\Dir2", NULL);
}

Шаг 7 — Чтобы избавиться от каталога, вы можете вызвать функцию RemoveDirectory () библиотеки Win32. Вот реализация обработчика события кнопки удаления.

void CMFCDirectoriesDemoDlg::OnBnClickedButtonDelete() {
   // TODO: Add your control notification handler code here
   if (RemoveDirectory(L"D:\\MFCDirectoryDEMO\\Dir1") == TRUE)
      AfxMessageBox(L"The directory has been deleted");
}

Шаг 8 — Если вы хотите переместить каталог, вы также можете вызвать ту же функцию MoveFile (). Вот реализация обработчика события кнопки перемещения, в которой мы сначала создадим новый каталог, а затем переместим Dir2 в этот каталог.

void CMFCDirectoriesDemoDlg::OnBnClickedButtonMove() {
   // TODO: Add your control notification handler code here
   CreateDirectory(L"D:\\MFCDirectory", NULL);

   if (MoveFile(L"D:\\MFCDirectoryDEMO\\Dir1", L"D:\\MFCDirectory\\Dir1") == TRUE)
      AfxMessageBox(L"The directory has been moved");
}

Шаг 9 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Справочники

Шаг 10 — Когда вы нажмете кнопку «Создать каталог», он создаст эти каталоги.

Справочники

Шаг 11 — Когда вы нажимаете кнопку «Удалить каталог», он удаляет Dir1.

Справочники

Обработка файлов

Большая часть обработки файлов в приложении MFC выполняется совместно с классом CArchive . Класс CArchive служит ретранслятором между приложением и носителем, используемым либо для хранения данных, либо для их доступности. Это позволяет сохранять сложную сеть объектов в постоянной двоичной форме (обычно на диске), которая сохраняется после удаления этих объектов.

Вот список методов в классе CArchive —

выкинуть

Закрывает архив без исключения.

близко

Сбрасывает неписанные данные и отключается от CFile .

Промывать

Сбрасывает неписанные данные из буфера архива.

Получить файл

Получает указатель объекта CFile для этого архива.

GetObjectSchema

Вызывается из функции Serialize для определения версии десериализованного объекта.

IsBufferEmpty

Определяет, был ли очищен буфер во время процесса получения Windows Sockets.

IsLoading

Определяет, загружается ли архив.

IsStoring

Определяет, хранится ли архив.

MapObject

Помещает на карту объекты, которые не сериализованы в файл, но доступны для ссылки на подобъекты.

Читать

Читает сырые байты.

ReadClass

Читает ссылку на класс, ранее сохраненную с WriteClass .

ReadObject

Вызывает функцию Serialize объекта для загрузки.

ReadString

Читает одну строку текста.

SerializeClass

Читает или записывает ссылку на класс в объект CArchive в зависимости от направления CArchive.

SetLoadParams

Устанавливает размер, до которого растет массив загрузки. Должен вызываться перед загрузкой любого объекта или перед вызовом MapObject или ReadObject .

SetObjectSchema

Устанавливает схему объекта, хранящуюся в объекте архива.

SetStoreParams

Устанавливает размер хеш-таблицы и размер блока карты, используемой для идентификации уникальных объектов в процессе сериализации.

Написать

Пишет необработанные байты.

WriteClass

Записывает ссылку на CRuntimeClass в CArchive.

WriteObject

Вызывает функцию Serialize объекта для сохранения.

WriteString

Пишет одну строку текста.

Вот список операторов, используемых для хранения и извлечения данных

Sr.No. Имя и описание
1

оператор <<

Хранит объекты и типы примитивов в архиве.

2

оператор >>

Загружает объекты и примитивные типы из архива.

оператор <<

Хранит объекты и типы примитивов в архиве.

оператор >>

Загружает объекты и примитивные типы из архива.

Давайте рассмотрим простой пример, создав новое приложение на основе диалогового окна MFC.

Шаг 1 — Перетащите один элемент управления для редактирования и две кнопки, как показано на следующем снимке.

Новый МФЦ

Шаг 2 — Добавьте управляющую переменную m_editCtrl и значение переменной m_strEdit для редактирования элемента управления.

Шаг 3 — Добавьте обработчик события нажатия для кнопок Открыть и Сохранить.

Шаг 4 — Вот реализация обработчиков событий.

void CMFCFileProcessingDlg::OnBnClickedButtonOpen() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   
   CFile file;
   
   file.Open(L"ArchiveText.rpr", CFile::modeRead);
   if(file) {
      CArchive ar(&file, CArchive::load);
   
      ar >> m_strEdit;
   
      ar.Close();
      file.Close();
   }
   UpdateData(FALSE);
}

void CMFCFileProcessingDlg::OnBnClickedButtonSave() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);

   if (m_strEdit.GetLength() == 0) {
      AfxMessageBox(L"You must enter the name of the text.");
      return;
   }
   CFile file;
   
   file.Open(L"ArchiveText.rpr", CFile::modeCreate | CFile::modeWrite);
   CArchive ar(&file, CArchive::store);
   ar << m_strEdit;
   
   ar.Close();
   file.Close();
}

Шаг 5 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Новый МФЦ

Шаг 6 — Напишите что-нибудь и нажмите Сохранить. Это сохранит данные в двоичном формате.

Новый МФЦ

Шаг 7 — Удалить тест из редактирования управления. При нажатии кнопки «Открыть» обратите внимание, что тот же текст загружается снова.

MFC — Стандартный ввод / вывод

Библиотека MFC предоставляет собственную версию обработки файлов. Это делается с помощью класса CStdioFile. Класс CStdioFile является производным от CFile. Он может обрабатывать чтение и запись текстовых файлов Unicode, а также обычных многобайтовых текстовых файлов.

Вот список конструкторов, которые могут инициализировать объект CStdioFile —

CStdioFile();
CStdioFile(CAtlTransactionManager* pTM);
CStdioFile(FILE* pOpenStream);
CStdioFile(LPCTSTR lpszFileName, UINT nOpenFlags);
CStdioFile(LPCTSTR lpszFileName, UINT nOpenFlags, CAtlTransactionManager* pTM);

Вот список методов в CStdioFile —

Sr.No. Имя и описание
1

открыто

Перегруженные. Open предназначен для использования с конструктором CStdioFile по умолчанию (переопределяет CFile :: Open).

2

ReadString

Читает одну строку текста.

3

Искать

Позиционирует текущий указатель файла.

4

WriteString

Пишет одну строку текста.

открыто

Перегруженные. Open предназначен для использования с конструктором CStdioFile по умолчанию (переопределяет CFile :: Open).

ReadString

Читает одну строку текста.

Искать

Позиционирует текущий указатель файла.

WriteString

Пишет одну строку текста.

Давайте снова рассмотрим простой пример, создав новое диалоговое приложение MFC.

Шаг 1 — Перетащите один элемент управления для редактирования и две кнопки, как показано на следующем снимке.

снимок

Шаг 2 — Добавьте значение переменной m_strEditCtrl для элемента управления редактирования.

снимок

Шаг 3 — Добавьте обработчик события нажатия для кнопок Открыть и Сохранить.

Шаг 4 — Вот реализация обработчиков событий.

void CMFCStandardIODlg::OnBnClickedButtonOpen() {
   
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);

   CStdioFile file;
   file.Open(L"D:\\MFCDirectoryDEMO\\test.txt", CFile::modeRead | CFile::typeText);
   
   file.ReadString(m_strEditCtrl);
   file.Close();
   UpdateData(FALSE);
}

void CMFCStandardIODlg::OnBnClickedButtonSave() {
   
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   CStdioFile file;
   if (m_strEditCtrl.GetLength() == 0) {

      AfxMessageBox(L"You must specify the text.");
      return;
   }
   file.Open(L"D:\\MFCDirectoryDEMO\\test.txt", CFile::modeCreate |
      CFile::modeWrite | CFile::typeText);
   file.WriteString(m_strEditCtrl);
   file.Close();
}

Шаг 5 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

снимок

Шаг 6 — Напишите что-нибудь и нажмите Сохранить. Это сохранит данные в файл * .txt.

снимок

Шаг 7 — Если вы посмотрите на местоположение файла, вы увидите, что он содержит файл test.txt.

снимок

Шаг 8 — Теперь закройте приложение. Запустите одно и то же приложение. Когда вы нажимаете Открыть, тот же текст загружается снова.

Шаг 9 — Он начинается с открытия файла, чтения файла с последующим обновлением элемента управления редактирования.

MFC — Просмотр документов

Архитектура Document / View является основой, используемой для создания приложений на основе библиотеки Microsoft Foundation Classes. Это позволяет вам различать различные части, составляющие компьютерную программу, включая то, что пользователь видит как часть вашего приложения, и документ, над которым он будет работать. Это делается с помощью комбинации отдельных классов, которые работают как ансамбль.

Части, составляющие архитектуру Document / View, — это фрейм, один или несколько документов и представление. Вместе эти объекты составляют полезное приложение.

Посмотреть

Представление — это платформа, над которой работает пользователь, чтобы выполнить свою работу. Чтобы позволить пользователю что-либо делать с приложением, вы должны предоставить представление, которое является объектом на основе класса CView. Вы можете либо напрямую использовать один из классов, производных от CView, либо вы можете получить свой собственный класс из CView или одного из его дочерних классов.

Документ

Документ похож на ведро. Для компьютерного приложения документ содержит данные пользователя. Чтобы создать часть документа этой архитектуры, вы должны получить объект из класса CDocument.

Рамка

Как следует из названия, рамка — это комбинация строительных блоков, структуры и границ элемента. Рамка придает окну «физическое» присутствие. Он также определяет местоположение объекта относительно рабочего стола Windows.

Интерфейс единого документа (SDI)

Выражение « Интерфейс одного документа» или SDI относится к документу, который может представлять пользователю только одно представление. Это означает, что приложение не может отображать более одного документа одновременно. Если вы хотите просмотреть другой тип документа текущего приложения, вы должны создать другой экземпляр приложения. Блокнот и WordPad являются примерами приложений SDI.

Давайте рассмотрим простой пример интерфейса с одним документом или SDI, создав новое диалоговое приложение MFC.

Шаг 1 — Давайте создадим новое приложение MFC MFCSDIDemo с нижеприведенными настройками.

SDI

Шаг 2 — Выберите Отдельный документ из Типа приложения и Стандарт MFC из Стиля проекта.

Шаг 3 — Нажмите Готово, чтобы продолжить.

Шаг 4 — После создания проекта запустите приложение, и вы увидите следующий результат.

SDI

Многодокументный интерфейс (MDI)

Приложение называется Multiple Document Interface , или MDI, если пользователь может открыть более одного документа в приложении, не закрывая его. Для обеспечения этой функциональности приложение предоставляет родительский фрейм, который выступает в качестве основного фрейма компьютерной программы. Внутри этого фрейма приложение позволяет создавать виды с отдельными фреймами, отличая каждый вид от другого.

Давайте рассмотрим простой пример интерфейса с несколькими документами или MDI, создав новое диалоговое приложение MFC.

Шаг 1 — Давайте создадим новое приложение MFC MFCMDIDemo с нижеприведенными настройками.

MDI

Шаг 2 — Выберите «Несколько документов» из типа приложения и стандарт MFC из стиля проекта.

Шаг 3 — Нажмите Готово, чтобы продолжить.

Шаг 4 — После создания проекта запустите приложение, и вы увидите следующий результат.

MDI

Шаг 5 — Когда вы нажимаете Файл → Новый пункт меню, он создает другое дочернее окно, как показано на следующем снимке.

MDI

Шаг 6 — В приложениях с многодокументным интерфейсом (MDI) для каждого приложения имеется один основной кадр. В этом случае CMDIFrameWnd и один CMDIChildWnd наследуют дочерний фрейм для каждого документа.

MFC — Струны

Строки — это объекты, которые представляют последовательности символов. Строка символов в стиле C возникла в языке C и продолжает поддерживаться в C ++.

  • Эта строка на самом деле является одномерным массивом символов, который заканчивается нулевым символом ‘\ 0’.

  • Строка с нулевым символом в конце содержит символы, которые составляют строку, за которой следует ноль.

Эта строка на самом деле является одномерным массивом символов, который заканчивается нулевым символом ‘\ 0’.

Строка с нулевым символом в конце содержит символы, которые составляют строку, за которой следует ноль.

Вот простой пример массива символов.

char word[12] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0' };

Следующее — другой способ представить это.

char word[] = "Hello, World";

Библиотека Microsoft Foundation Class (MFC) предоставляет класс для управления строкой, называемый CString . Ниже приведены некоторые важные особенности CString.

  • CString не имеет базового класса.

  • Объект CString состоит из последовательности символов переменной длины.

  • CString предоставляет функции и операторы, используя синтаксис, аналогичный синтаксису Basic.

  • Операторы конкатенации и сравнения вместе с упрощенным управлением памятью упрощают использование объектов CString, чем обычные символьные массивы.

CString не имеет базового класса.

Объект CString состоит из последовательности символов переменной длины.

CString предоставляет функции и операторы, используя синтаксис, аналогичный синтаксису Basic.

Операторы конкатенации и сравнения вместе с упрощенным управлением памятью упрощают использование объектов CString, чем обычные символьные массивы.

Вот конструктор CString.

Sr.No. Метод и описание
1

CString

Создает объекты CString различными способами.

CString

Создает объекты CString различными способами.

Вот список методов массива —

Sr.No. Метод и описание
1

GetLength

Возвращает количество символов в объекте CString.

2

Пустой

Проверяет, содержит ли объект CString символы.

3

пустой

Заставляет строку иметь длину 0.

4

GetAt

Возвращает символ в указанной позиции.

5

Установлен на

Устанавливает символ в указанной позиции.

GetLength

Возвращает количество символов в объекте CString.

Пустой

Проверяет, содержит ли объект CString символы.

пустой

Заставляет строку иметь длину 0.

GetAt

Возвращает символ в указанной позиции.

Установлен на

Устанавливает символ в указанной позиции.

Вот список методов сравнения —

Sr.No. Метод и описание
1

сравнить

Сравнивает две строки (с учетом регистра).

2

CompareNoCase

Сравнивает две строки (без учета регистра).

сравнить

Сравнивает две строки (с учетом регистра).

CompareNoCase

Сравнивает две строки (без учета регистра).

Вот список методов извлечения —

Sr.No. Метод и описание
1

средний

Извлекает среднюю часть строки (как функция Basic MID $).

2

Оставил

Извлекает левую часть строки (как функция Basic LEFT $).

3

Правильно

Извлекает правую часть строки (как функция Basic RIGHT $).

4

SpanIncluding

Извлекает символы из строки, которые находятся в заданном наборе символов.

5

SpanExcluding

Извлекает символы из строки, которых нет в данном наборе символов.

средний

Извлекает среднюю часть строки (как функция Basic MID $).

Оставил

Извлекает левую часть строки (как функция Basic LEFT $).

Правильно

Извлекает правую часть строки (как функция Basic RIGHT $).

SpanIncluding

Извлекает символы из строки, которые находятся в заданном наборе символов.

SpanExcluding

Извлекает символы из строки, которых нет в данном наборе символов.

Вот список методов конвертации.

Sr.No. Метод и описание
1

MakeUpper

Преобразует все символы в этой строке в символы верхнего регистра.

2

MakeLower

Преобразует все символы в этой строке в строчные буквы.

3

MakeReverse

Меняет символы в этой строке.

4

Формат

Отформатируйте строку, как это делает sprintf.

5

TrimLeft

Обрезать ведущие пробельные символы из строки.

6

TrimRight

Обрезать завершающие пробелы в строке.

MakeUpper

Преобразует все символы в этой строке в символы верхнего регистра.

MakeLower

Преобразует все символы в этой строке в строчные буквы.

MakeReverse

Меняет символы в этой строке.

Формат

Отформатируйте строку, как это делает sprintf.

TrimLeft

Обрезать ведущие пробельные символы из строки.

TrimRight

Обрезать завершающие пробелы в строке.

Вот список методов поиска.

Sr.No. Метод и описание
1

найти

Находит символ или подстроку внутри большей строки.

2

ReverseFind

Находит символ внутри большей строки; начинается с конца.

3

FindOneOf

Находит первый соответствующий символ из набора.

найти

Находит символ или подстроку внутри большей строки.

ReverseFind

Находит символ внутри большей строки; начинается с конца.

FindOneOf

Находит первый соответствующий символ из набора.

Вот список методов доступа к буферу.

Sr.No. Метод и описание
1

GetBuffer

Возвращает указатель на символы в CString.

2

GetBufferSetLength

Возвращает указатель на символы в CString, усеченный до указанной длины.

3

ReleaseBuffer

Освобождает контроль над буфером, возвращаемым GetBuffer

4

FreeExtra

Удаляет любые издержки этого строкового объекта, освобождая любую дополнительную память, ранее выделенную для строки.

5

LockBuffer

Отключает подсчет ссылок и защищает строку в буфере.

6

UnlockBuffer

Включает подсчет ссылок и освобождает строку в буфере.

GetBuffer

Возвращает указатель на символы в CString.

GetBufferSetLength

Возвращает указатель на символы в CString, усеченный до указанной длины.

ReleaseBuffer

Освобождает контроль над буфером, возвращаемым GetBuffer

FreeExtra

Удаляет любые издержки этого строкового объекта, освобождая любую дополнительную память, ранее выделенную для строки.

LockBuffer

Отключает подсчет ссылок и защищает строку в буфере.

UnlockBuffer

Включает подсчет ссылок и освобождает строку в буфере.

Вот список специфичных для Windows методов.

Sr.No. Метод и описание
1

AllocSysString

Выделяет BSTR из данных CString.

2

SetSysString

Устанавливает существующий объект BSTR с данными из объекта CString.

3

LoadString

Загружает существующий объект CString из ресурса Windows CE.

AllocSysString

Выделяет BSTR из данных CString.

SetSysString

Устанавливает существующий объект BSTR с данными из объекта CString.

LoadString

Загружает существующий объект CString из ресурса Windows CE.

Ниже приведены различные операции над объектами CString.

Создать строку

Вы можете создать строку, используя строковый литерал или создав экземпляр класса CString.

BOOL CMFCStringDemoDlg::OnInitDialog() {

   CDialogEx::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);         // Set big icon
   SetIcon(m_hIcon, FALSE);       // Set small icon

   CString string1 = _T("This is a string1");
   CString string2("This is a string2");

   m_strText.Append(string1 + L"\n");
   m_strText.Append(string2);

   UpdateData(FALSE);

   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Создать строку

Пустой строки

Вы можете создать пустую строку с помощью литерала пустой строки или с помощью метода CString :: Empty (). Вы также можете проверить, является ли строка пустой или нет, используя логическое свойство isEmpty.

BOOL CMFCStringDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);            // Set big icon
   SetIcon(m_hIcon, FALSE);           // Set small icon

   CString string1 = _T("");
   CString string2;
   string2.Empty();

   if(string1.IsEmpty())
      m_strText.Append(L"String1 is empty\n");
   else
      m_strText.Append(string1 + L"\n");
   
   if(string2.IsEmpty())
      m_strText.Append(L"String2 is empty");
   else
      m_strText.Append(string2);
   UpdateData(FALSE);
   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Пустой строки

Конкатенация строк

Чтобы объединить две или более строк, вы можете использовать оператор + для объединения двух строк или метод CString :: Append ().

BOOL CMFCStringDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);              // Set big icon
   SetIcon(m_hIcon, FALSE);              // Set small icon

   //To concatenate two CString objects
   CString s1 = _T("This ");           // Cascading concatenation
   s1 += _T("is a ");
   CString s2 = _T("test");
   CString message = s1;
   message.Append(_T("big ") + s2);
   // Message contains "This is a big test".

   m_strText = L"message: " + message;

   UpdateData(FALSE);

   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Конкатенация строк

Длина строки

Чтобы найти длину строки, вы можете использовать метод CString :: GetLength (), который возвращает количество символов в объекте CString.

BOOL CMFCStringDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
   
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);              // Set big icon
   SetIcon(m_hIcon, FALSE);              // Set small icon

   CString string1 = _T("This is string 1");
   int length = string1.GetLength();
   CString strLen;

   strLen.Format(L"\nString1 contains %d characters", length);
   m_strText = string1 + strLen;

   UpdateData(FALSE);

   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Длина строки

Сравнение строк

Для сравнения двух строковых переменных вы можете использовать оператор ==

BOOL CMFCStringDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
   
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);            // Set big icon
   SetIcon(m_hIcon, FALSE);          // Set small icon

   CString string1 = _T("Hello");
   CString string2 = _T("World");

   CString string3 = _T("MFC Tutorial");
   CString string4 = _T("MFC Tutorial");

   if (string1 == string2)
      m_strText = "string1 and string1 are same\n";
   else
      m_strText = "string1 and string1 are not same\n";

   if (string3 == string4)
      m_strText += "string3 and string4 are same";
   else
      m_strText += "string3 and string4 are not same";

   UpdateData(FALSE);

   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Сравнение строк

MFC — CArray

CArray — это коллекция, которая лучше всего используется для данных, доступ к которым осуществляется случайным или не последовательным образом. Класс CArray поддерживает массивы, которые похожи на массивы C, но могут динамически уменьшаться и увеличиваться по мере необходимости.

  • Индексы массива всегда начинаются с позиции 0.

  • Вы можете решить, фиксировать ли верхнюю границу или разрешить расширение массива при добавлении элементов после текущей границы.

  • Память выделяется смежно с верхней границей, даже если некоторые элементы равны нулю.

Индексы массива всегда начинаются с позиции 0.

Вы можете решить, фиксировать ли верхнюю границу или разрешить расширение массива при добавлении элементов после текущей границы.

Память выделяется смежно с верхней границей, даже если некоторые элементы равны нулю.

добавлять

Добавляет элемент в конец массива; при необходимости увеличивает массив.

присоединять

Добавляет другой массив в массив; при необходимости увеличивает массив

копия

Копирует другой массив в массив; при необходимости увеличивает массив.

ElementAt

Возвращает временную ссылку на указатель элемента в массиве.

FreeExtra

Освобождает всю неиспользуемую память выше текущей верхней границы.

GetAt

Освобождает всю неиспользуемую память выше текущей верхней границы.

GetCount

Получает количество элементов в этом массиве.

Получить данные

Разрешает доступ к элементам в массиве. Может быть NULL .

GetSize

Получает количество элементов в этом массиве.

GetUpperBound

Возвращает самый большой действительный индекс.

InsertAt

Вставляет элемент (или все элементы в другом массиве) по указанному индексу.

Пустой

Определяет, является ли массив пустым.

Удалить все

Удаляет все элементы из этого массива.

RemoveAt

Удаляет элемент по определенному индексу.

Установлен на

Устанавливает значение для данного индекса; массив не может расти.

SetAtGrow

Устанавливает значение для данного индекса; при необходимости увеличивает массив.

SetSize

Устанавливает количество элементов, которые будут содержаться в этом массиве.

Ниже приведены различные операции над объектами CArray.

Создать объект CArray

Чтобы создать коллекцию значений или объектов CArray, сначала необходимо определить тип значений коллекции. Вы можете использовать один из существующих примитивных типов данных, таких как int, CString, double и т. Д., Как показано ниже;

CArray<CString, CString>strArray;

Добавить предметы

Чтобы добавить элемент, вы можете использовать функцию CArray :: Add (). Он добавляет элемент в конец массива. В OnInitDialog () создается объект CArray и добавляются три имени, как показано в следующем коде.

CArray<CString, CString>strArray;

//Add names to CArray
strArray.Add(L"Ali");
strArray.Add(L"Ahmed");
strArray.Add(L"Mark");

Получить предметы

Чтобы получить любой элемент, вы можете использовать функцию CArray :: GetAt (). Эта функция принимает один целочисленный параметр в качестве индекса массива.

Шаг 1 — Давайте посмотрим на простой пример, который будет получать все имена.

//Retrive names from CArray
   for (int i = 0; i < strArray.GetSize(); i++) {
      m_strText.Append(strArray.GetAt(i) + L"\n");
   }

Шаг 2 — Вот полная реализация CMFCCArrayDlg :: OnInitDialog ()

BOOL CMFCCArrayDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);               // Set big icon
   SetIcon(m_hIcon, FALSE);             // Set small icon

   // TODO: Add extra initialization here
   CArray<CString, CString>strArray;
   
   //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");
   
   //Retrive names from CArray
   for (int i = 0; i < strArray.GetSize(); i++) {
      m_strText.Append(strArray.GetAt(i) + L"\n");
   }
   
   UpdateData(FALSE);
   return TRUE; // return TRUE unless you set the focus to a control
}

Шаг 3 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Получить предметы

Добавить товары в середине

Чтобы добавить элемент в середину массива, вы можете использовать функцию CArray ::. InsertAt (). Требуется два параметра — во-первых, индекс и во-вторых, значение.

Давайте вставим новый элемент с индексом 1, как показано в следующем коде.

BOOL CMFCCArrayDlg::OnInitDialog() {
   
   CDialogEx::OnInitDialog();
   
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);             // Set big icon
   SetIcon(m_hIcon, FALSE);            // Set small icon

   // TODO: Add extra initialization here
   CArray<CString, CString>strArray;
   //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");

   strArray.InsertAt(1, L"Allan");

   //Retrive names from CArray
   for (int i = 0; i < strArray.GetSize(); i++) {
      m_strText.Append(strArray.GetAt(i) + L"\n");
   }

   UpdateData(FALSE);
   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод. Теперь вы можете увидеть имя Аллана Ддеда как второй индекс.

Добавить товары

Обновить значение элемента

Для обновления элемента в середине массива вы можете использовать функцию CArray ::. SetAt (). Требуется два параметра — во-первых, индекс и во-вторых, значение.

Давайте обновим третий элемент в массиве, как показано в следующем коде.

BOOL CMFCCArrayDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);                 // Set big icon
   SetIcon(m_hIcon, FALSE);               // Set small icon

   // TODO: Add extra initialization here
   CArray<CString, CString>strArray;

   //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");
  
   strArray.InsertAt(1, L"Allan");
   
   strArray.SetAt(2, L"Salman");
   
   //Retrive names from CArray
   for (int i = 0; i < strArray.GetSize(); i++) {
      m_strText.Append(strArray.GetAt(i) + L"\n");
   }

   UpdateData(FALSE);
   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод. Теперь вы можете видеть, что значение третьего элемента обновлено.

Обновить элементы

Копировать массив

Чтобы скопировать весь массив в другой объект CArray, вы можете использовать функцию CArray :: Copy ().

Шаг 1 — Давайте создадим другой массив и скопируем все элементы из первого массива, как показано в следующем коде.

BOOL CMFCCArrayDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   // Add "About..." menu item to system menu.

   // IDM_ABOUTBOX must be in the system command range.
   ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
   ASSERT(IDM_ABOUTBOX < 0xF000);
   CMenu* pSysMenu = GetSystemMenu(FALSE);
   if (pSysMenu != NULL) {
      BOOL bNameValid;
      CString strAboutMenu;
      bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
      ASSERT(bNameValid);
      if (!strAboutMenu.IsEmpty()) {
         pSysMenuAppendMenu(MF_SEPARATOR);
         pSysMenuAppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
      }
   }
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);               // Set big icon
   SetIcon(m_hIcon, FALSE);              // Set small icon

   // TODO: Add extra initialization here
   CArray<CString, CString>strArray;
   //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");

   strArray.InsertAt(1, L"Allan");

   strArray.SetAt(2, L"Salman");

   CArray<CString, CString>strArray2;
   strArray2.Copy(strArray);
   //Retrive names from CArray
   for (int i = 0; i < strArray2.GetSize(); i++) {
      m_strText.Append(strArray2.GetAt(i) + L"\n");
   }

   UpdateData(FALSE);
   return TRUE; // return TRUE unless you set the focus to a control
}

Теперь вы можете видеть, что мы получили элемент из 2- го массива, и результат такой же, потому что мы использовали функцию копирования.

Копировать массив

Удалить элементы

Чтобы удалить любой конкретный элемент, вы можете использовать функцию CArray :: RemoveAt (). Чтобы удалить все элементы из списка, можно использовать функцию CArray :: RemoveAll ().

Давайте удалим второй элемент из массива.

BOOL CMFCCArrayDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   SetIcon(m_hIcon, TRUE);             // Set big icon
   SetIcon(m_hIcon, FALSE);            // Set small icon

   // TODO: Add extra initialization here
   CArray<CString, CString>strArray;

   //Add names to CArray
   strArray.Add(L"Ali");
   strArray.Add(L"Ahmed");
   strArray.Add(L"Mark");

   strArray.InsertAt(1, L"Allan");

   strArray.SetAt(2, L"Salman");

   CArray<CString, CString>strArray2;
   strArray2.Copy(strArray);

   strArray2.RemoveAt(1);

   //Retrive names from CArray
   for (int i = 0; i < strArray2.GetSize(); i++) {
      m_strText.Append(strArray2.GetAt(i) + L"\n");
   }

   UpdateData(FALSE);
   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод. Теперь вы можете видеть, что имя Аллан больше не является частью массива.

Удалить элементы

MFC — связанные списки

Связанный список — это линейная структура данных, где каждый элемент является отдельным объектом. Каждый элемент (назовем его узлом) списка состоит из двух элементов — данных и ссылки на следующий узел. Последний узел имеет ссылку на ноль.

Связанный список — это структура данных, состоящая из группы узлов, которые вместе представляют последовательность. Это способ хранения данных со структурами, позволяющий программисту автоматически создавать новое место для хранения данных при необходимости. Некоторые из его характерных особенностей —

  • Связанный список — это последовательность ссылок, которая содержит элементы.

  • Каждая ссылка содержит ссылку на другую ссылку.

  • Каждый элемент в списке называется узлом.

  • Если список содержит хотя бы один узел, то новый узел позиционируется как последний элемент в списке.

  • Если в списке есть только один узел, этот узел представляет первый и последний элемент.

Связанный список — это последовательность ссылок, которая содержит элементы.

Каждая ссылка содержит ссылку на другую ссылку.

Каждый элемент в списке называется узлом.

Если список содержит хотя бы один узел, то новый узел позиционируется как последний элемент в списке.

Если в списке есть только один узел, этот узел представляет первый и последний элемент.

Есть два типа списка ссылок —

Единственный связанный список

Односвязные списки являются типом структуры данных. В односвязном списке каждый узел в списке хранит содержимое узла и указатель или ссылку на следующий узел в списке.

Единый связанный список

Двусвязный список

Двусвязный список — это структура связанных данных, которая состоит из набора последовательно связанных записей, называемых узлами. Каждый узел содержит два поля, которые являются ссылками на предыдущий и следующий узел в последовательности узлов.

Двойной связанный список

Класс CList

MFC предоставляет класс CList, который является реализацией связанного списка шаблонов и работает отлично. Списки CList ведут себя как двусвязные списки. Переменная типа POSITION является ключом для списка. Вы можете использовать переменную POSITION в качестве итератора для последовательного обхода списка и в качестве закладки для хранения места.

AddHead

Добавляет элемент (или все элементы в другом списке) к заголовку списка (создает новый заголовок).

AddTail

Добавляет элемент (или все элементы в другом списке) в конец списка (создает новый хвост).

найти

Получает позицию элемента, указанного значением указателя.

FindIndex

Получает положение элемента, указанного индексом, начинающимся с нуля.

GetAt

Получает элемент в заданной позиции.

GetCount

Возвращает количество элементов в этом списке.

GetHead

Возвращает элемент заголовка списка (не может быть пустым).

GetHeadPosition

Возвращает позицию элемента заголовка списка.

GetNext

Получает следующий элемент для итерации.

GetPrev

Получает предыдущий элемент для итерации.

GetSize

Возвращает количество элементов в этом списке.

GetTail

Возвращает хвостовой элемент списка (не может быть пустым).

GetTailPosition

Возвращает позицию хвостового элемента списка.

InsertAfter

Вставляет новый элемент после заданной позиции.

InsertBefore

Вставляет новый элемент перед заданной позицией.

Пустой

Проверяет состояние пустого списка (без элементов).

Удалить все

Удаляет все элементы из этого списка.

RemoveAt

Удаляет элемент из этого списка, указанный положением.

RemoveHead

Удаляет элемент из заголовка списка.

RemoveTail

Удаляет элемент из хвоста списка.

Установлен на

Устанавливает элемент в заданной позиции.

Ниже приведены различные операции над объектами CList.

Создать объект CList

Чтобы создать коллекцию значений или объектов CList, вы должны сначала определить тип значений коллекции. Вы можете использовать один из существующих примитивных типов данных, таких как int, CString, double и т. Д., Как показано ниже в следующем коде.

CList<double, double>m_list;

Добавить предметы

Чтобы добавить элемент, вы можете использовать функцию CList :: AddTail (). Добавляет элемент в конец списка. Чтобы добавить элемент в начале списка, вы можете использовать функцию CList :: AddHead (). В OnInitDialog () CList создается объект и добавляются четыре значения, как показано в следующем коде.

CList<double, double>m_list;

//Add items to the list
m_list.AddTail(100.75);
m_list.AddTail(85.26);
m_list.AddTail(95.78);
m_list.AddTail(90.1);

Получить предметы

Переменная типа POSITION является ключом для списка. Вы можете использовать переменную POSITION в качестве итератора для последовательного обхода списка.

Шаг 1 — Чтобы извлечь элемент из списка, мы можем использовать следующий код, который будет извлекать все значения.

//iterate the list
POSITION pos = m_list.GetHeadPosition();
while (pos) { 
   double nData = m_list.GetNext(pos);
   CString strVal;
   strVal.Format(L"%.2f\n", nData);
   m_strText.Append(strVal);
}

Шаг 2 — Вот полная функция CMFCCListDemoDlg :: OnInitDialog ().

BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);             // Set big icon
   SetIcon(m_hIcon, FALSE);             // Set small icon

   // TODO: Add extra initialization here
   CList<double, double>m_list;

   //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);

   //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.f\n", nData);
      m_strText.Append(strVal);
   }

   UpdateData(FALSE);
 
   return TRUE; // return TRUE unless you set the focus to a control
}

Шаг 3 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

извлекать

Добавить товары в середине

Чтобы добавить элемент в середину списка, вы можете использовать функции CList ::. InsertAfter () и CList ::. InsertBefore (). Требуется два параметра — во-первых, позиция (где она может быть добавлена) и во-вторых, значение.

Шаг 1 — Давайте вставим новый элемент, как показано в следующем коде.

BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
   
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);             // Set big icon
   SetIcon(m_hIcon, FALSE);          // Set small icon

   // TODO: Add extra initialization here
   CList<double, double>m_list;

   //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);

   POSITION position = m_list.Find(85.26);
   m_list.InsertBefore(position, 200.0);
   m_list.InsertAfter(position, 300.0);

   //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.2f\n", nData);
      m_strText.Append(strVal);
   }

   UpdateData(FALSE);

   return TRUE; // return TRUE unless you set the focus to a control
}

Шаг 2. Теперь вы видите, что мы сначала получили позицию значения 85,26, а затем вставили один элемент до и один элемент после этого значения.

Шаг 3 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Добавление предмета

Обновить значение элемента

Чтобы обновить элемент в середине массива, вы можете использовать функцию CArray ::. SetAt (). Требуется два параметра — во-первых, позиция и во-вторых, значение.

Давайте обновим список с 300,00 до 400 в списке, как показано в следующем коде.

BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);              // Set big icon
   SetIcon(m_hIcon, FALSE);            // Set small icon

   // TODO: Add extra initialization here
   CList<double, double>m_list;

   //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);

   POSITION position = m_list.Find(85.26);
   m_list.InsertBefore(position, 200.0);
   m_list.InsertAfter(position, 300.0);

   position = m_list.Find(300.00);
   m_list.SetAt(position, 400.00);

   //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.2f\n", nData);
      m_strText.Append(strVal);
   }

   UpdateData(FALSE);

   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод. Теперь вы можете видеть, что значение 300,00 обновляется до 400,00.

Обновление товара

Удалить элементы

Чтобы удалить любой конкретный элемент, вы можете использовать функцию CList :: RemoveAt (). Чтобы удалить все элементы из списка, можно использовать функцию CList :: RemoveAll ().

Давайте удалим элемент, который имеет 95,78 в качестве значения.

BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);              // Set big icon
   SetIcon(m_hIcon, FALSE);             // Set small icon

   // TODO: Add extra initialization here
   CList<double, double>m_list;

   //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);

   POSITION position = m_list.Find(85.26);
   m_list.InsertBefore(position, 200.0);
   m_list.InsertAfter(position, 300.0);
   
   position = m_list.Find(300.00);
   m_list.SetAt(position, 400.00);

   position = m_list.Find(95.78);
   m_list.RemoveAt(position);

   //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.2f\n", nData);
      m_strText.Append(strVal);
   }
   UpdateData(FALSE);
   
   return TRUE; // return TRUE unless you set the focus to a control
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод. Теперь вы можете видеть, что значение 95,78 больше не является частью списка.

Удаление предмета

MFC — База данных классов

База данных — это набор информации, которая организована таким образом, чтобы к ней можно было легко обращаться, управлять и обновлять. Классы базы данных MFC на основе ODBC предназначены для обеспечения доступа к любой базе данных, для которой доступен драйвер ODBC. Поскольку классы используют ODBC, ваше приложение может получать доступ к данным в разных форматах и ​​в разных локальных / удаленных конфигурациях.

Вам не нужно писать специальный код для работы с различными системами управления базами данных (СУБД). Пока ваши пользователи имеют соответствующий драйвер ODBC для данных, к которым они хотят получить доступ, они могут использовать вашу программу для манипулирования данными в таблицах, хранящихся там. Источник данных — это конкретный экземпляр данных, размещенный в некоторой системе управления базами данных (СУБД). Примеры включают Microsoft SQL Server, Microsoft Access и т. Д.

CDatabase

MFC предоставляет класс CDatabase, который представляет собой соединение с источником данных, с помощью которого вы можете работать с источником данных. Вы можете иметь один или несколько объектов CDatabase одновременно активными в вашем приложении.

BeginTrans

Запускает «транзакцию» — серию обратимых вызовов функций-членов AddNew, Edit, Delete и Update класса CRecordset — на подключенном источнике данных. Источник данных должен поддерживать транзакции, чтобы BeginTrans имел какой-либо эффект.

BindParameters

Позволяет связать параметры перед вызовом ExecuteSQL .

отменить

Отменяет асинхронную операцию или процесс из второго потока.

CanTransact

Возвращает ненулевое значение, если источник данных поддерживает транзакции.

CanUpdate

Возвращает ненулевое значение, если объект CDatabase является обновляемым (не только для чтения).

близко

Закрывает соединение с источником данных.

CommitTrans

Завершает транзакцию, начатую BeginTrans. Команды в транзакции, которые изменяют источник данных, выполняются.

ExecuteSQL

Выполняет инструкцию SQL. Записи данных не возвращаются.

GetBookmarkPersistence

Определяет операции, посредством которых закладки сохраняются на объектах набора записей.

GetConnect

Возвращает строку подключения ODBC, используемую для подключения объекта CDatabase к источнику данных.

GetCursorCommitBehavior

Определяет влияние совершения транзакции на объект открытого набора записей.

GetCursorRollbackBehavior

Определяет влияние отката транзакции на открытый объект набора записей.

GetDatabaseName

Возвращает имя базы данных, используемой в данный момент.

Открыт

Возвращает ненулевое значение, если объект CDatabase в настоящее время подключен к источнику данных.

OnSetOptions

Вызывается структурой для установки стандартных параметров подключения. Реализация по умолчанию устанавливает значение времени ожидания запроса. Вы можете установить эти параметры заранее, вызвав SetQueryTimeout .

открыто

Устанавливает соединение с источником данных (через драйвер ODBC).

OpenEx

Устанавливает соединение с источником данных (через драйвер ODBC).

отмена

Отменяет изменения, сделанные во время текущей транзакции. Источник данных возвращается в прежнее состояние, как определено при вызове BeginTrans, без изменений.

SetLoginTimeout

Устанавливает количество секунд, по истечении которых попытка подключения к источнику данных истекает.

SetQueryTimeout

Устанавливает количество секунд, по истечении которых операции запроса к базе данных будут задерживаться. Влияет на все последующие наборы записей Open, AddNew, Edit и Delete на вызовы.

Давайте рассмотрим простой пример, создав новое приложение на основе диалогового окна MFC.

Шаг 1 — Измените заголовок строки TODO на Извлечение данных из базы данных и перетащите одну кнопку и один элемент управления List, как показано на следующем снимке.

Получить данные из БД

Шаг 2 — Добавьте обработчик события нажатия для кнопки и управляющую переменную m_ListControl для управления списком.

Шаг 3 — У нас есть простая база данных, которая содержит одну таблицу сотрудников с несколькими записями, как показано на следующем снимке.

Стол сотрудников

Шаг 4 — Нам нужно включить следующий файл заголовков, чтобы мы могли использовать класс CDatabase.

#include "odbcinst.h"
#include "afxdb.h"

Вставить запрос

Оператор SQL INSERT INTO используется для добавления новых строк данных в таблицу в базе данных.

Шаг 1 — Чтобы добавить новые записи, мы будем использовать функцию ExecuteSQL () класса CDatabase, как показано в следующем коде.

CDatabase database;
CString SqlString;
CString strID, strName, strAge;
CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
CString sDsn;
CString sFile = L"D:\\Test.mdb";
// You must change above path if it's different
int iRec = 0;

// Build ODBC connection string
sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
TRY {
   // Open the database
   database.Open(NULL,false,false,sDsn);

   SqlString = "INSERT INTO Employees (ID,Name,age) VALUES (5,'Sanjay',69)";
   database.ExecuteSQL(SqlString);
   // Close the database
   database.Close();
}CATCH(CDBException, e) {
   // If a database exception occured, show error msg
   AfxMessageBox(L"Database error: " + em_strError);
}
END_CATCH;

Шаг 2 — Когда приведенный выше код скомпилирован и выполнен, вы увидите, что новая запись добавлена ​​в вашу базу данных.

Вставить очередь

Получить запись

Чтобы извлечь приведенную выше таблицу в приложении MFC, мы реализуем операции, связанные с базой данных, в обработчике событий кнопки, как показано в следующих шагах.

Шаг 1 — Чтобы использовать CDatabase, создайте объект CDatabase и вызовите его функцию Open (). Это откроет соединение.

Шаг 2 — Создайте объекты CRecordset для работы с подключенным источником данных, передайте конструктору набора записей указатель на ваш объект CDatabase.

Шаг 3 — После использования соединения вызовите функцию Close и уничтожьте объект CDatabase.

void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
   // TODO: Add your control notification handler code here
   CDatabase database;
   CString SqlString;
   CString strID, strName, strAge;
   CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)";
   CString sFile = L"D:\\Test.mdb";
   // You must change above path if it's different
   int iRec = 0;

   // Build ODBC connection string
   sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
   TRY {
      // Open the database
      database.Open(NULL,false,false,sDsn);

      // Allocate the recordset
      CRecordset recset( &database );

      // Build the SQL statement
      SqlString = "SELECT ID, Name, Age " "FROM Employees";

      // Execute the query
	  
      recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);
      // Reset List control if there is any data
      ResetListControl();
      // populate Grids
      ListView_SetExtendedListViewStyle(m_ListControl,LVS_EX_GRIDLINES);

      // Column width and heading
      m_ListControl.InsertColumn(0,"Emp ID",LVCFMT_LEFT,-1,0);
      m_ListControl.InsertColumn(1,"Name",LVCFMT_LEFT,-1,1);
      m_ListControl.InsertColumn(2, "Age", LVCFMT_LEFT, -1, 1);
      m_ListControl.SetColumnWidth(0, 120);
      m_ListControl.SetColumnWidth(1, 200);
      m_ListControl.SetColumnWidth(2, 200);

      // Loop through each record
      while( !recset.IsEOF() ) {
         // Copy each column into a variable
         recset.GetFieldValue("ID",strID);
         recset.GetFieldValue("Name",strName);
         recset.GetFieldValue("Age", strAge);

         // Insert values into the list control
         iRec = m_ListControl.InsertItem(0,strID,0);
         m_ListControl.SetItemText(0,1,strName);
         m_ListControl.SetItemText(0, 2, strAge);

         // goto next record
         recset.MoveNext();
      }
      // Close the database
      database.Close();
   }CATCH(CDBException, e) {
      // If a database exception occured, show error msg
      AfxMessageBox("Database error: "+em_strError);
   }
   END_CATCH; 
}

// Reset List control
void CMFCDatabaseDemoDlg::ResetListControl() {
   m_ListControl.DeleteAllItems();
   int iNbrOfColumns;
   CHeaderCtrl* pHeader = (CHeaderCtrl*)m_ListControl.GetDlgItem(0);
   if (pHeader) {
      iNbrOfColumns = pHeaderGetItemCount();
   }
   for (int i = iNbrOfColumns; i >= 0; i--) {
      m_ListControl.DeleteColumn(i);
   }
}

Шаг 4 — Вот файл заголовка.

// MFCDatabaseDemoDlg.h : header file
//

#pragma once
#include "afxcmn.h"


// CMFCDatabaseDemoDlg dialog
class CMFCDatabaseDemoDlg : public CDialogEx {
   // Construction
   public:
      CMFCDatabaseDemoDlg(CWnd* pParent = NULL);    // standard constructor

   // Dialog Data
   #ifdef AFX_DESIGN_TIME
      enum { IDD = IDD_MFCDATABASEDEMO_DIALOG };
   #endif

   protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
      void ResetListControl();

   // Implementation
   protected:
      HICON m_hIcon;

      // Generated message map functions
      virtual BOOL OnInitDialog();
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      DECLARE_MESSAGE_MAP()
   public:
      CListCtrl m_ListControl;
      afx_msg void OnBnClickedButtonRead();
};

Шаг 5 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Получить запись

Шаг 6 — Нажмите кнопку Read, чтобы выполнить операции с базой данных. Он получит таблицу сотрудников.

Получить запись

Обновить запись

Запрос SQL UPDATE используется для изменения существующих записей в таблице. Вы можете использовать предложение WHERE с запросом UPDATE для обновления выбранных строк, в противном случае все строки будут затронуты.

Шаг 1 — Давайте рассмотрим простой пример, обновив Age, где ID равен 5.

SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";
database.ExecuteSQL(SqlString);

Шаг 2 — Вот полный код события нажатия кнопки.

void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
   // TODO: Add your control notification handler code here
   CDatabase database;
   CString SqlString;
   CString strID, strName, strAge;
   CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
   CString sDsn;
   CString sFile =
      L"C:\\Users\\Muhammad.Waqas\\Downloads\\Compressed\\ReadDB_demo\\Test.mdb";
   // You must change above path if it's different
   int iRec = 0;

   // Build ODBC connection string
   sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
   TRY {
      // Open the database
      database.Open(NULL,false,false,sDsn);

      // Allocate the recordset
      CRecordset recset(&database);

      SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";

      database.ExecuteSQL(SqlString);

      SqlString = "SELECT ID, Name, Age FROM Employees";

      // Build the SQL statement
      SqlString = "SELECT ID, Name, Age FROM Employees";

      // Execute the query
      recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);

      // Reset List control if there is any data
      ResetListControl();
      // populate Grids
      ListView_SetExtendedListViewStyle(m_listCtrl,LVS_EX_GRIDLINES);

      // Column width and heading
      m_listCtrl.InsertColumn(0,L"Emp ID",LVCFMT_LEFT,-1,0);
      m_listCtrl.InsertColumn(1,L"Name",LVCFMT_LEFT,-1,1);
      m_listCtrl.InsertColumn(2, L"Age", LVCFMT_LEFT, -1, 1);
      m_listCtrl.SetColumnWidth(0, 120);
      m_listCtrl.SetColumnWidth(1, 200);
      m_listCtrl.SetColumnWidth(2, 200);

      // Loop through each record
      while (!recset.IsEOF()) {
         // Copy each column into a variable
         recset.GetFieldValue(L"ID",strID);
         recset.GetFieldValue(L"Name",strName);
         recset.GetFieldValue(L"Age", strAge);

         // Insert values into the list control
         iRec = m_listCtrl.InsertItem(0,strID,0);
         m_listCtrl.SetItemText(0,1,strName);
         m_listCtrl.SetItemText(0, 2, strAge);

         // goto next record
         recset.MoveNext();
      }

      // Close the database
      database.Close();
   }CATCH(CDBException, e) {
      // If a database exception occured, show error msg
      AfxMessageBox(L"Database error: " + em_strError);
   }
   END_CATCH;
}

Шаг 3 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Получить запись

Шаг 4 — Нажмите кнопку Read, чтобы выполнить операции с базой данных. Он получит следующую таблицу сотрудников.

Обновить запись

Шаг 5 — Теперь вы можете видеть, что возраст обновлен с 69 до 59 лет.

Удалить запись

Запрос SQL DELETE используется для удаления существующих записей из таблицы. Вы можете использовать предложение WHERE с запросом DELETE для удаления выбранных строк, в противном случае все записи будут удалены.

Шаг 1 — Давайте рассмотрим простой пример, удалив запись, где ID равен 3.

SqlString = L"DELETE FROM Employees WHERE ID = 3;";

database.ExecuteSQL(SqlString);

Шаг 2 — Вот полный код события нажатия кнопки.

void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
   // TODO: Add your control notification handler code here
   CDatabase database;
   CString SqlString;
   CString strID, strName, strAge;
   CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
   CString sDsn;
   CString sFile =
       L"C:\\Users\\Muhammad.Waqas\\Downloads\\Compressed\\ReadDB_demo\\Test.mdb";

   // You must change above path if it's different
   int iRec = 0;

   // Build ODBC connection string
   sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
   TRY {
      // Open the database
      database.Open(NULL,false,false,sDsn);

      // Allocate the recordset
      CRecordset recset(&database);

      SqlString = L"DELETE FROM Employees WHERE ID = 3;";

      database.ExecuteSQL(SqlString);

      SqlString = "SELECT ID, Name, Age FROM Employees";

      // Build the SQL statement
      SqlString = "SELECT ID, Name, Age FROM Employees";

      // Execute the query
      recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);

      // Reset List control if there is any data
      ResetListControl();
      // populate Grids
      ListView_SetExtendedListViewStyle(m_listCtrl,LVS_EX_GRIDLINES);
      // Column width and heading
      m_listCtrl.InsertColumn(0,L"Emp ID",LVCFMT_LEFT,-1,0);
      m_listCtrl.InsertColumn(1,L"Name",LVCFMT_LEFT,-1,1);
      m_listCtrl.InsertColumn(2, L"Age", LVCFMT_LEFT, -1, 1);
      m_listCtrl.SetColumnWidth(0, 120);
      m_listCtrl.SetColumnWidth(1, 200);
      m_listCtrl.SetColumnWidth(2, 200);

      // Loop through each record
      while (!recset.IsEOF()) {
         // Copy each column into a variable
         recset.GetFieldValue(L"ID",strID);
         recset.GetFieldValue(L"Name",strName);
         recset.GetFieldValue(L"Age", strAge);

         // Insert values into the list control
         iRec = m_listCtrl.InsertItem(0,strID,0);
         m_listCtrl.SetItemText(0,1,strName);
         m_listCtrl.SetItemText(0, 2, strAge);

         // goto next record
         recset.MoveNext();
      }
      // Close the database
      database.Close();
   }CATCH(CDBException, e) {
      // If a database exception occured, show error msg
      AfxMessageBox(L"Database error: " + em_strError);
   }
   END_CATCH;
}

Шаг 3 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Получить запись

Шаг 4 — Нажмите кнопку Read, чтобы выполнить операции с базой данных. Он получит таблицу сотрудников.

Обновить запись

MFC — Сериализация

Сериализация — это процесс записи или чтения объекта на постоянный носитель, такой как файл на диске, или с него. Сериализация идеальна для ситуаций, когда желательно поддерживать состояние структурированных данных (таких как классы или структуры C ++) во время или после выполнения программы.

При выполнении обработки файлов значения обычно имеют примитивные типы (char, short, int, float или double). Таким же образом, мы можем индивидуально сохранить много значений, по одному за раз. Этот метод не включает в себя объект, созданный из (в качестве переменной) класса.

Библиотека MFC имеет высокий уровень поддержки сериализации. Он начинается с класса CObject, который является предком для большинства классов MFC, который оснащен функцией-членом Serialize ().

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

Шаг 1 — Удалите строку TODO и создайте диалоговое окно, как показано на следующем снимке.

Удалить TODO Line

Шаг 2 — Добавьте переменные значения для всех элементов управления редактирования. Для упомянутых Emp ID и Age типом значения является целое число, как показано на следующем снимке.

Сериализация Добавить Вар

Шаг 3 — Добавьте обработчик событий для обеих кнопок.

Шаг 4 — Давайте теперь добавим простой класс Employee, который нам нужно сериализовать. Вот объявление класса Employee в заголовочном файле.

class CEmployee : public CObject {
   public:
      int empID;
      CString empName;
      int age;
      CEmployee(void);
      ~CEmployee(void);
   private:

   public:
      void Serialize(CArchive& ar);
      DECLARE_SERIAL(CEmployee);
};

Шаг 5 — Вот определение класса Employee в исходном (* .cpp) файле.

IMPLEMENT_SERIAL(CEmployee, CObject, 0)
CEmployee::CEmployee(void) {

}

CEmployee::~CEmployee(void) {

}

void CEmployee::Serialize(CArchive& ar) {
   CObject::Serialize(ar);

   if (ar.IsStoring())
      ar << empID << empName << age;
   else
      ar >> empID >> empName >> age;
}

Шаг 6 — Вот реализация обработчика события кнопки «Сохранить».

void CMFCSerializationDlg::OnBnClickedButtonSave() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   CEmployee employee;
   CFile file;
   file.Open(L"EmployeeInfo.hse", CFile::modeCreate | CFile::modeWrite);
   CArchive ar(&file, CArchive::store);
   employee.empID = m_id;
   employee.empName = m_strName;
   employee.age = m_age;
   employee.Serialize(ar);
   ar.Close();
}

Шаг 7 — Вот реализация обработчика события кнопки «Открыть».

void CMFCSerializationDlg::OnBnClickedButtonOpen() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);

   CFile file;

   file.Open(L"EmployeeInfo.hse", CFile::modeRead);
   CArchive ar(&file, CArchive::load);
   CEmployee employee;

   employee.Serialize(ar);

   m_id = employee.empID;
   m_strName = employee.empName;
   m_age = employee.age;
   ar.Close();
   file.Close();

   UpdateData(FALSE);
}

Шаг 8 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Результат сериализации

Шаг 9 — Введите информацию во все поля и нажмите Сохранить и закрыть эту программу.

Сериализация Вставить информацию

Шаг 10 — Это сохранит данные. Запустите приложение еще раз и нажмите кнопку Открыть. Он загрузит информацию о сотруднике.

Сериализация Сохранить информацию

MFC — Многопоточность

Библиотека Microsoft Foundation Class (MFC) обеспечивает поддержку многопоточных приложений. Поток — это путь выполнения внутри процесса. Когда вы запускаете Блокнот, операционная система создает процесс и начинает выполнение основного потока этого процесса. Когда этот поток завершается, процесс тоже.

Вы можете создать дополнительные темы в своем приложении, если хотите. Все потоки в приложениях MFC представлены объектами CWinThread. В большинстве ситуаций вам даже не нужно явно создавать эти объекты; вместо этого вызовите вспомогательную функцию фреймворка AfxBeginThread, которая создаст для вас объект CWinThread.

Давайте рассмотрим простой пример, создав новое приложение на основе диалогового окна MFC.

Шаг 1 — Измените заголовок и идентификатор статического элемента управления на Нажмите кнопку «Начать тему» и IDC_STATIC_TEXT соответственно.

Шаг 2 — Перетащите две кнопки и добавьте обработчики событий щелчка для этих кнопок.

Кнопка «Начать тему»

Шаг 3 — Добавьте переменную управления для статического контроля текста.

Шаг 4 — Теперь добавьте следующие три глобальные переменные в начале файла CMFCMultithreadingDlg.cpp.

int currValue;
int maxValue;
BOOL stopNow;

Шаг 5 — Добавьте сообщение WM_TIMER в класс CMFCMultithreadingDlg.

Вот реализация OnTimer ()

void CMFCMultithreadingDlg::OnTimer(UINT_PTR nIDEvent) {
   // TODO: Add your message handler code here and/or call default
   CString sStatusMsg;
   sStatusMsg.Format(L"Running: %d", currValue);
   m_ctrlStatus.SetWindowText(sStatusMsg);

   CDialogEx::OnTimer(nIDEvent);
}

Шаг 6 — Теперь добавьте пример функции для использования в AfxBeginThread в классе CMFCMultithreadingDlg.

UINT MyThreadProc(LPVOID Param) {
   while (!stopNow && (currValue < maxValue)) {
      currValue++;
      Sleep(50);     // would do some work here
   }
   
   return TRUE;
}

Шаг 7 — Вот реализация обработчика события для кнопки Start Thread, которая запустит поток.

void CMFCMultithreadingDlg::OnBnClickedButtonStart() {
   // TODO: Add your control notification handler code here
   currValue = 0;
   maxValue = 5000;
   stopNow = 0;
   m_ctrlStatus.SetWindowText(L"Starting...");
   SetTimer(1234, 333, 0); // 3 times per second

   AfxBeginThread(MyThreadProc, 0); // <<== START THE THREAD
}

Шаг 8 — Вот реализация обработчика события для кнопки Stop Thread, которая остановит поток.

void CMFCMultithreadingDlg::OnBnClickedButtonStop() {
   
   // TODO: Add your control notification handler code here
   stopNow = TRUE;
   KillTimer(1234);
   m_ctrlStatus.SetWindowText(L"Stopped");
}

Шаг 9 — Вот полный исходный файл.

// MFCMultithreadingDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MFCMultithreading.h"
#include "MFCMultithreadingDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CMFCMultithreadingDlg dialog

int currValue;
int maxValue;
BOOL stopNow;

CMFCMultithreadingDlg::CMFCMultithreadingDlg(CWnd* pParent /* = NULL*/)
   : CDialogEx(IDD_MFCMULTITHREADING_DIALOG, pParent) {
   m_hIcon = AfxGetApp() -> LoadIcon(IDR_MAINFRAME);
}
void CMFCMultithreadingDlg::DoDataExchange(CDataExchange* pDX) {
   CDialogEx::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_STATIC_TEXT, m_ctrlStatus);
}

BEGIN_MESSAGE_MAP(CMFCMultithreadingDlg, CDialogEx)
   ON_WM_PAINT()
   ON_WM_QUERYDRAGICON()
   ON_BN_CLICKED(IDC_BUTTON_START,
      &CMFCMultithreadingDlg::OnBnClickedButtonStart)
   ON_WM_TIMER()
   ON_BN_CLICKED(IDC_BUTTON_STOP,
      &CMFCMultithreadingDlg::OnBnClickedButtonStop)
END_MESSAGE_MAP()

// CMFCMultithreadingDlg message handlers

BOOL CMFCMultithreadingDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);        // Set big icon
   SetIcon(m_hIcon, FALSE);       // Set small icon

   // TODO: Add extra initialization here

   return TRUE; // return TRUE unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CMFCMultithreadingDlg::OnPaint() {
   if (IsIconic()) {
      CPaintDC dc(this); // device context for painting
      SendMessage(WM_ICONERASEBKGND,
         reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
			
      // Center icon in client rectangle
      int cxIcon = GetSystemMetrics(SM_CXICON);
      int cyIcon = GetSystemMetrics(SM_CYICON);
      CRect rect;
      GetClientRect(&rect);
      int x = (rect.Width() - cxIcon + 1) / 2;
      int y = (rect.Height() - cyIcon + 1) / 2;

      // Draw the icon
      dc.DrawIcon(x, y, m_hIcon);
   }else {
      CDialogEx::OnPaint();
   }
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMFCMultithreadingDlg::OnQueryDragIcon() {
   return static_cast<HCURSOR>(m_hIcon);
}

UINT /*CThreadDlg::*/MyThreadProc(LPVOID Param) //Sample function for using in
AfxBeginThread {
   while (!stopNow && (currValue < maxValue)) {
      currValue++;
      Sleep(50); // would do some work here
   }
   return TRUE;
}
void CMFCMultithreadingDlg::OnBnClickedButtonStart() {
   // TODO: Add your control notification handler code here
   currValue = 0;
   maxValue = 5000;
   stopNow = 0;
   m_ctrlStatus.SetWindowText(L"Starting...");
   SetTimer(1234, 333, 0); // 3 times per second

   AfxBeginThread(MyThreadProc, 0); // <<== START THE THREAD
}

void CMFCMultithreadingDlg::OnTimer(UINT_PTR nIDEvent) {
   // TODO: Add your message handler code here and/or call default
   CString sStatusMsg;
   sStatusMsg.Format(L"Running: %d", currValue);
   m_ctrlStatus.SetWindowText(sStatusMsg);

   CDialogEx::OnTimer(nIDEvent);
}

void CMFCMultithreadingDlg::OnBnClickedButtonStop() {
   // TODO: Add your control notification handler code here
   stopNow = TRUE;
   KillTimer(1234);
   m_ctrlStatus.SetWindowText(L"Stopped");
}

Шаг 10 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Многопоточность

Шаг 11 — Теперь нажмите на кнопку «Начать тему».

Начать тему

Шаг 12 — Нажмите кнопку «Остановить поток». Это остановит поток.

Остановить поток

MFC — интернет-программирование

Microsoft предоставляет множество API для программирования как клиентских, так и серверных приложений. Многие новые приложения пишутся для Интернета, и по мере изменения технологий, возможностей браузера и параметров безопасности будут создаваться новые типы приложений. Ваше пользовательское приложение может получать информацию и предоставлять данные в Интернете.

MFC предоставляет класс CSocket для написания сетевых коммуникационных программ с Windows Sockets.

Вот список методов в классе CSocket.

Sr.No. Имя и описание
1

Прикреплять

Присоединяет дескриптор SOCKET к объекту CSocket.

2

CancelBlockingCall

Отменяет блокирующий вызов, который в данный момент выполняется.

3

Создайте

Создает сокет.

4

FromHandle

Возвращает указатель на объект CSocket с заданным дескриптором SOCKET.

5

IsBlocking

Определяет, выполняется ли блокирующий вызов.

Прикреплять

Присоединяет дескриптор SOCKET к объекту CSocket.

CancelBlockingCall

Отменяет блокирующий вызов, который в данный момент выполняется.

Создайте

Создает сокет.

FromHandle

Возвращает указатель на объект CSocket с заданным дескриптором SOCKET.

IsBlocking

Определяет, выполняется ли блокирующий вызов.

Давайте рассмотрим простой пример, создав приложение MFS SDI.

MFCServer

Шаг 1 — Введите MFCServer в поле имени и нажмите OK.

MFCServer

Шаг 2 — На вкладке «Дополнительные функции» установите флажок Windows Sockets.

Шаг 3 — После создания проекта добавьте новый класс MFC CServerSocket.

MFCServer

Шаг 4 — Выберите CSocket в качестве базового класса и нажмите Finish.

Шаг 5 — Добавьте еще класс MFC CReceivingSocket.

MFCServer

Шаг 6 — CRecevingSocket будет получать входящие сообщения от клиента.

В CMFCServerApp заголовочный файл содержит следующие файлы:

#include "ServerSocket.h"
#include "MFCServerView.h"

Шаг 7 — Добавьте следующие две переменные класса в класс CMFCServerApp.

CServerSocket m_serverSocket;
CMFCServerView m_pServerView;

Шаг 8 — В методе CMFCServerApp :: InitInstance () создайте сокет и укажите порт, а затем вызовите метод Listen, как показано ниже.

m_serverSocket.Create(6666);
m_serverSocket.Listen();

Шаг 9 — Включите следующий заголовочный файл в заголовочный файл CMFCServerView.

#include "MFCServerDoc.h"

Шаг 10 — Переопределите функцию OnAccept из класса Socket.

MFCServer

Шаг 11 — Выберите CServerSocket в представлении класса и выделенный значок в окне свойств. Теперь добавьте OnAccept. Вот реализация функции OnAccept.

void CServerSocket::OnAccept(int nErrorCode) {

   // TODO: Add your specialized code here and/or call the base class
   AfxMessageBox(L"Connection accepted");
   CSocket::OnAccept(nErrorCode);
}

Шаг 12 — Добавьте функцию OnReceive ().

void CServerSocket::OnReceive(int nErrorCode) { 
   
   // TODO: Add your specialized code here and/or call the base class
   AfxMessageBox(L"Data Received");
   CSocket::OnReceive(nErrorCode);
}

Шаг 13 — Добавьте функцию OnReceive () в класс CReceivingSocket.

Щелкните правой кнопкой мыши класс CMFCServerView в обозревателе решений и выберите «Добавить» → «Добавить функцию».

MFCServer

Шаг 14 — Введите вышеупомянутую информацию и нажмите Готово.

Шаг 15 — Добавьте следующую переменную CStringArray в заголовочный файл CMFCServerView.

CStringArray m_msgArray;

Шаг 16 — Вот реализация функции AddMsg ().

void CMFCServerView::AddMsg(CString message) {

   m_msgArray.Add(message);
   Invalidate();
}

Шаг 17 — Обновите конструктор, как показано в следующем коде.

CMFCServerView::CMFCServerView() {

   ((CMFCServerApp*)AfxGetApp()) -> m_pServerView = this;
}

Шаг 18 — Вот реализация функции OnDraw (), которая отображает сообщения.

void CMFCServerView::OnDraw(CDC* pDC) {

   int y = 100;
   for (int i = 0; m_msgArray.GetSize(); i++) {
   
      pDC->TextOut(100, y, m_msgArray.GetAt(i));
      y += 50;
   }
   CMFCServerDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

Шаг 19 — Серверная часть теперь завершена. Он получит сообщение от клиента.

Создать клиентское приложение

Шаг 1 — Давайте создадим новое диалоговое приложение MFC для клиентского приложения.

Сторона клиента

Сторона клиента

Шаг 2 — На вкладке «Дополнительные функции» установите флажок Windows Sockets, как показано выше.

Шаг 3. После создания проекта создайте диалоговое окно, как показано на следующем снимке.

Сторона клиента

Шаг 4 — Добавьте обработчики событий для кнопок Connect и Send.

Шаг 5 — Добавьте переменные значения для всех трех элементов управления редактирования. Для управления редактированием порта выберите тип переменной UINT.

Сторона клиента

Шаг 6 — Добавьте класс MFC для подключения и отправки сообщений.

Сторона клиента

Шаг 7. Включите заголовочный файл класса CClientSocket в заголовочный файл класса CMFCClientDemoApp и добавьте переменную класса. Аналогичным образом добавьте переменную класса в заголовочный файл CMFCClientDemoDlg.

CClientSocket m_clientSocket;

Шаг 8 — Вот реализация обработчика события кнопки Connect.

void CMFCClientDemoDlg::OnBnClickedButtonConnect() {

   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   m_clientSocket.Create();
   if (m_clientSocket.Connect(m_ipAddress, m_port)) {
      AfxMessageBox(L"Connection Successfull");
   }else {
      AfxMessageBox(L"Connection Failed");
   }
   DWORD error = GetLastError();
}

Шаг 9 — Вот реализация обработчика события кнопки «Отправить».

void CMFCClientDemoDlg::OnBnClickedButtonSend() {

   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   if (m_clientSocket.Send(m_message.GetBuffer(m_message.GetLength()), m_message.GetLength())) {
   
   }else {
      AfxMessageBox(L"Failed to send message");
   }
}

Шаг 10 — Сначала запустите приложение сервера, а затем клиентское приложение. Введите IP-адрес и порт локального хоста и нажмите «Подключиться».

Сторона клиента

Шаг 11 — Теперь вы увидите сообщение на стороне сервера, как показано на следующем снимке.

Сторона клиента

МФЦ — GDI

Windows предоставляет различные инструменты рисования для использования в контексте устройства. Он предоставляет ручки для рисования линий, кисти для заливки интерьеров и шрифты для рисования текста. MFC предоставляет классы графических объектов, эквивалентные инструментам рисования в Windows.

Рисование

Контекст устройства — это структура данных Windows, содержащая информацию об атрибутах рисования устройства, такого как дисплей или принтер. Все вызовы рисования выполняются через объект-контекст устройства, который инкапсулирует API-интерфейсы Windows для рисования линий, фигур и текста.

Контексты устройства позволяют независимое от устройства рисование в Windows. Контекст устройства можно использовать для рисования на экране, на принтере или в метафайле.

CDC — самый фундаментальный класс для рисования в MFC. Объект CDC предоставляет функции-члены для выполнения основных этапов рисования, а также элементы для работы с контекстом отображения, связанным с клиентской областью окна.

Старший Имя и описание
1

AbortDoc

Завершает текущее задание на печать, стирая все, что приложение записало на устройство с момента последнего вызова функции- члена StartDoc .

2

AbortPath

Закрывает и отбрасывает любые пути в контексте устройства.

3

AddMetaFileComment

Копирует комментарий из буфера в указанный метафайл расширенного формата.

4

AlphaBlend

Отображает растровые изображения с прозрачными или полупрозрачными пикселями.

5

AngleArc

Рисует отрезок линии и дугу и перемещает текущую позицию в конечную точку дуги.

6

дуга

Рисует эллиптическую дугу.

7

аркто

Рисует эллиптическую дугу. Эта функция похожа на Arc, за исключением того, что текущая позиция обновляется.

8

Прикреплять

Присоединяет контекст устройства Windows к этому объекту CDC.

9

BeginPath

Открывает скобку пути в контексте устройства.

10

BitBlt

Копирует растровое изображение из указанного контекста устройства.

11

Аккорд

Рисует аккорд (замкнутая фигура, ограниченная пересечением эллипса и отрезка).

12

CloseFigure

Закрывает открытую фигуру в дорожке.

13

CreateCompatibleDC

Создает контекст устройства памяти, который совместим с другим контекстом устройства. Вы можете использовать его для подготовки изображений в памяти.

14

CreateDC

Создает контекст устройства для определенного устройства.

15

CREATEIC

Создает информационный контекст для конкретного устройства. Это обеспечивает быстрый способ получения информации об устройстве без создания контекста устройства.

16

DeleteDC

Удаляет контекст устройства Windows, связанный с этим объектом CDC.

17

DeleteTempMap

Вызывается простым обработчиком CWinApp для удаления любого временного объекта CDC, созданного FromHandle. Также отключает контекст устройства.

18

отрывать

Отсоединяет контекст устройства Windows от этого объекта CDC.

19

DPtoHIMETRIC

Преобразует единицы измерения устройства в единицы HIMETRIC .

20

DPtoLP

Преобразует единицы устройства в логические единицы.

21

Draw3dRect

Рисует трехмерный прямоугольник.

22

DrawDragRect

Стирает и перерисовывает прямоугольник при его перетаскивании.

23

DrawEdge

Рисует края прямоугольника.

24

DrawEscape

Доступ к возможностям рисования видео дисплея, которые не доступны напрямую через интерфейс графического устройства (GDI).

25

DrawFocusRect

Рисует прямоугольник в стиле, используемом для обозначения фокуса.

26

DrawFrameControl

Нарисуйте рамку управления.

27

DrawIcon

Рисует иконку.

28

DrawState

Отображает изображение и применяет визуальный эффект, чтобы указать состояние.

29

DrawText

Рисует форматированный текст в указанном прямоугольнике.

30

DrawTextEx

Рисует форматированный текст в указанном прямоугольнике, используя дополнительные форматы.

31

Эллипс

Рисует эллипс

32

EndDoc

Завершает задание печати, запущенное функцией-членом StartDoc.

33

EndPage

Сообщает драйверу устройства, что страница заканчивается.

34

EndPath

Закрывает скобку пути и выбирает путь, определенный скобкой, в контекст устройства.

35

EnumObjects

Перечисляет ручки и кисти, доступные в контексте устройства.

36

Побег

Позволяет приложениям получать доступ к средствам, которые не доступны напрямую с определенного устройства через GDI. Также позволяет доступ к функциям побега Windows. Escape-вызовы, сделанные приложением, переводятся и отправляются драйверу устройства.

37

ExcludeClipRect

Создает новую область отсечения, которая состоит из существующей области отсечения минус указанный прямоугольник.

38

ExcludeUpdateRgn

Предотвращает рисование в недопустимых областях окна, исключая обновленную область в окне из области отсечения.

39

ExtFloodFill

Заполняет область текущей кистью. Обеспечивает большую гибкость, чем функция- член FloodFill .

40

ExtTextOut

Записывает строку символов в прямоугольной области, используя текущий выбранный шрифт.

41

FillPath

Закрывает все открытые фигуры в текущем пути и заполняет внутреннюю часть пути, используя текущую кисть и режим полигонального заполнения.

42

FillRect

Заполняет данный прямоугольник с помощью определенной кисти.

43

FillRgn

Заполняет определенный регион указанной кистью.

44

FillSolidRect

Заполняет прямоугольник сплошным цветом.

45

FlattenPath

Преобразует любые кривые на выбранном пути в текущий контекст устройства и превращает каждую кривую в последовательность линий.

46

Заливка

Заполняет область текущей кистью.

47

FrameRect

Рисует рамку вокруг прямоугольника.

48

FrameRgn

Рисует границу вокруг определенной области с помощью кисти.

49

FromHandle

Возвращает указатель на объект CDC, когда ему дается дескриптор контекста устройства. Если объект CDC не прикреплен к дескриптору, создается и присоединяется временный объект CDC.

50

GetArcDirection

Возвращает текущее направление дуги для контекста устройства.

51

GetAspectRatioFilter

Получает настройку для текущего фильтра соотношения сторон.

52

GetBkColor

Получает текущий цвет фона.

53

GetBkMode

Получает фоновый режим.

54

GetBoundsRect

Возвращает текущий накопленный ограничивающий прямоугольник для указанного контекста устройства.

55

GetBrushOrg

Получает источник текущей кисти.

56

GetCharABCWidths

Извлекает ширину в логических единицах последовательных символов в заданном диапазоне из текущего шрифта.

57

GetCharABCWidthsI

Извлекает ширину в логических единицах последовательных индексов глифов в указанном диапазоне из текущего шрифта TrueType.

58

GetCharacterPlacement

Получает различные типы информации о символьной строке.

59

GetCharWidth

Извлекает дробные ширины последовательных символов в заданном диапазоне из текущего шрифта.

60

GetCharWidthI

Извлекает ширину в логических координатах последовательных индексов глифов в указанном диапазоне из текущего шрифта.

61

GetClipBox

Извлекает размеры самого тесного ограничивающего прямоугольника вокруг текущей границы отсечения.

62

GetColorAdjustment

Получает значения регулировки цвета для контекста устройства.

63

GetCurrentBitmap

Возвращает указатель на текущий выбранный объект CBitmap .

64

GetCurrentBrush

Возвращает указатель на текущий выбранный объект CBrush .

65

GetCurrentFont

Возвращает указатель на текущий выбранный объект CFont .

66

GetCurrentPalette

Возвращает указатель на текущий выбранный объект CPalette .

48

GetCurrentPen

Возвращает указатель на текущий выбранный объект CPen .

67

GetCurrentPosition

Получает текущее положение пера (в логических координатах).

68

GetDCBrushColor

Получает текущий цвет кисти.

69

GetDCPenColor

Получает текущий цвет пера.

70

GetDeviceCaps

Извлекает определенный вид специфической для устройства информации о возможностях данного устройства отображения.

71

GetFontData

Извлекает информацию о метрике шрифта из файла масштабируемого шрифта. Информация для извлечения идентифицируется путем указания смещения в файле шрифта и длины возвращаемой информации.

72

GetFontLanguageInfo

Возвращает информацию о текущем выбранном шрифте для указанного контекста дисплея.

73

GetGlyphOutline

Извлекает контурную кривую или растровое изображение для символа контура в текущем шрифте.

74

GetGraphicsMode

Получает текущий графический режим для указанного контекста устройства.

75

GetHalftoneBrush

Получает полутоновую кисть.

76

GetKerningPairs

Извлекает пары символов кернинга для шрифта, выбранного в данный момент в указанном контексте устройства.

77

GetLayout

Получает макет контекста устройства (DC). Макет может быть слева направо (по умолчанию) или справа налево (зеркально отображено).

78

GetMapMode

Получает текущий режим отображения.

79

GetMiterLimit

Возвращает ограничение митры для контекста устройства.

80

GetNearestColor

Извлекает ближайший логический цвет к указанному логическому цвету, который может представлять данное устройство.

81

GetOutlineTextMetrics

Извлекает информацию о метрике шрифта для шрифтов TrueType.

82

GetOutputCharWidth

Извлекает ширину отдельных символов в последовательной группе символов из текущего шрифта, используя контекст устройства вывода.

83

GetOutputTabbedTextExtent

Вычисляет ширину и высоту строки символов в контексте устройства вывода.

84

GetOutputTextExtent

Вычисляет ширину и высоту строки текста в контексте устройства вывода, используя текущий шрифт для определения размеров.

85

GetOutputTextMetrics

Извлекает метрики для текущего шрифта из контекста устройства вывода.

86

GetPath

Извлекает координаты, определяющие конечные точки линий и контрольные точки кривых, найденных на пути, выбранном в контексте устройства.

87

GetPixel

Получает значение цвета RGB пикселя в указанной точке.

88

GetPolyFillMode

Получает текущий режим заполнения полигонов.

89

GetROP2

Получает текущий режим рисования.

90

GetSafeHdc

Возвращает m_hDC , контекст устройства вывода.

91

GetStretchBltMode

Получает текущий режим растрового изображения.

92

GetTabbedTextExtent

Вычисляет ширину и высоту строки символов в контексте устройства атрибута.

93

GetTextAlign

Получает флаги выравнивания текста.

94

GetTextCharacterExtra

Извлекает текущую настройку для интервала между символами.

95

GetTextColor

Получает текущий цвет текста.

96

GetTextExtent

Вычисляет ширину и высоту строки текста в контексте устройства атрибута, используя текущий шрифт для определения размеров.

97

GetTextExtentExPointI

Извлекает количество символов в указанной строке, которые поместятся в указанном пространстве, и заполняет массив текстовым экстентом для каждого из этих символов.

98

GetTextExtentPointI

Получает ширину и высоту указанного массива индексов глифов.

99

GetTextFace

Копирует имя гарнитуры текущего шрифта в буфер в виде строки с нулевым символом в конце.

100

GetTextMetrics

Извлекает метрики для текущего шрифта из атрибута контекста устройства.

101

GetViewportExt

Извлекает x- и y-экстенты области просмотра.

102

GetViewportOrg

Получает x- и y-координаты источника области просмотра.

103

GetWindow

Возвращает окно, связанное с контекстом устройства отображения.

104

GetWindowExt

Извлекает x- и y-экстенты связанного окна.

105

GetWindowOrg

Получает x- и y-координаты источника связанного окна.

106

GetWorldTransform

Извлекает текущее преобразование пространства мира в пространство страниц.

107

GradientFill

Заполняет прямоугольные и треугольные структуры градуирующим цветом.

108

GrayString

Рисует затемненный (серый) текст в заданном месте.

109

HIMETRICtoDP

Преобразует единицы HIMETRIC в единицы устройства.

110

HIMETRICtoLP

Преобразует HIMETRIC единицы в логические единицы.

111

IntersectClipRect

Создает новую область отсечения, формируя пересечение текущей области и прямоугольника.

112

InvertRect

Инвертирует содержимое прямоугольника.

113

InvertRgn

Инвертирует цвета в регионе.

114

IsPrinting

Определяет, используется ли контекст устройства для печати.

115

LineTo

Рисует линию от текущей позиции до, но не включая точку.

116

LPtoDP

Преобразует логические единицы в единицы устройства.

117

LPtoHIMETRIC

Преобразует логические единицы в ХИМЕТРИЧЕСКИЕ единицы.

118

MaskBlt

Объединяет данные цвета для исходных и целевых растровых изображений с использованием заданной маски и растровой операции.

119

ModifyWorldTransform

Изменяет трансформацию мира для контекста устройства, используя указанный режим.

120

MoveTo

Перемещает текущую позицию.

121

OffsetClipRgn

Перемещает область отсечения данного устройства.

122

OffsetViewportOrg

Изменяет начало области просмотра относительно координат текущего источника просмотра.

123

OffsetWindowOrg

Изменяет начало окна относительно координат текущего источника окна.

124

PaintRgn

Заполняет область выбранной кистью.

125

PatBlt

Создает немного шаблон.

126

пирог

Рисует пирог в форме клина.

127

PlayMetaFile

Воспроизведение содержимого указанного метафайла на данном устройстве. Расширенная версия PlayMetaFile отображает изображение, хранящееся в данном метафайле расширенного формата. Метафайл может быть воспроизведен любое количество раз.

128

PlgBlt

Выполняет передачу битового блока битов цветовых данных из указанного прямоугольника в контексте исходного устройства в указанный параллелограмм в данном контексте устройства.

129

PolyBezier

Рисует один или несколько сплайнов Безье. Текущая позиция не используется и не обновляется.

130

PolyBezierTo

Рисует один или несколько сплайнов Bzier и перемещает текущую позицию в конечную точку последнего сплайна Bzier.

131

PolyDraw

Рисует набор отрезков линии и сплайнов Бзье. Эта функция обновляет текущую позицию.

132

многоугольник

Рисует многоугольник, состоящий из двух или более точек (вершин), соединенных линиями.

133

Ломаная

Рисует набор отрезков, соединяющих указанные точки.

134

PolylineTo

Рисует одну или несколько прямых линий и перемещает текущую позицию в конечную точку последней линии.

135

PolyPolygon

Создает два или более полигонов, которые заполнены, используя текущий режим заполнения полигонов. Полигоны могут быть непересекающимися или могут перекрываться.

136

PolyPolyline

Рисует несколько серий соединенных отрезков. Текущая позиция не используется и не обновляется этой функцией.

137

PtVisible

Указывает, находится ли данная точка в области отсечения.

138

RealizePalette

Сопоставляет записи палитры в текущей логической палитре с системной палитрой.

139

Прямоугольник

Рисует прямоугольник, используя текущее перо, и заполняет его, используя текущую кисть.

140

RectVisible

Определяет, находится ли какая-либо часть данного прямоугольника в области отсечения.

141

ReleaseAttribDC

Выпускает m_hAttribDC , атрибут устройства контекста.

142

ReleaseOutputDC

Выпускает m_hDC , контекст устройства вывода.

143

ResetDC

Обновляет контекст устройства m_hAttribDC.

144

RestoreDC

Восстанавливает контекст устройства в предыдущее состояние, сохраненное с помощью SaveDC .

145

ROUNDRECT

Рисует прямоугольник с закругленными углами, используя текущее перо, и заливает, используя текущую кисть.

146

SaveDC

Сохраняет текущее состояние контекста устройства.

147

ScaleViewportExt

Изменяет экстент области просмотра относительно текущих значений.

148

ScaleWindowExt

Изменяет экстенты окна относительно текущих значений.

149

ScrollDC

Прокручивает прямоугольник бит по горизонтали и вертикали.

150

SelectClipPath

Выбирает текущий путь в качестве области отсечения для контекста устройства, комбинируя новую область с любой существующей областью отсечения, используя указанный режим.

151

SelectClipRgn

Объединяет данную область с текущей областью отсечения, используя указанный режим.

152

SelectObject

Выбирает объект рисования GDI, например, перо.

153

SelectPalette

Выбирает логическую палитру.

154

SelectStockObject

Выбирает одну из предопределенных стандартных ручек, кистей или шрифтов, предоставляемых Windows.

155

SetAbortProc

Устанавливает функцию обратного вызова, предоставляемую программистом, которую Windows вызывает, если задание на печать должно быть прервано.

156

SetArcDirection

Устанавливает направление рисования, которое будет использоваться для функций дуги и прямоугольника.

157

SetAttribDC

Устанавливает m_hAttribDC, атрибут устройства контекста.

158

SetBkColor

Устанавливает текущий цвет фона.

159

SetBkMode

Устанавливает режим фона.

160

SetBoundsRect

Управляет накоплением информации о ограничительном прямоугольнике для указанного контекста устройства.

161

SetBrushOrg

Определяет источник для следующей кисти, выбранной в контексте устройства.

162

SetColorAdjustment

Устанавливает значения регулировки цвета для контекста устройства, используя указанные значения.

163

SetDCBrushColor

Устанавливает текущий цвет кисти.

164

SetDCPenColor

Устанавливает текущий цвет пера.

165

SetGraphicsMode

Устанавливает текущий графический режим для указанного контекста устройства.

166

SetLayout

Изменяет макет контекста устройства (DC).

167

SetMapMode

Устанавливает текущий режим отображения.

168

SetMapperFlags

Изменяет алгоритм, используемый сопоставителем шрифтов при сопоставлении логических шрифтов с физическими шрифтами.

169

SetMiterLimit

Устанавливает ограничение длины соединений митры для контекста устройства.

170

SetOutputDC

Устанавливает m_hDC, контекст устройства вывода.

171

SetPixel

Устанавливает пиксель в указанной точке в ближайшее приближение указанного цвета.

172

SetPixelV

Устанавливает пиксель в указанных координатах в ближайшее приближение указанного цвета. SetPixelV работает быстрее, чем SetPixel, поскольку ему не нужно возвращать значение цвета фактически нарисованной точки.

173

SetPolyFillMode

Устанавливает режим заполнения полигонов.

175

SetROP2

Устанавливает текущий режим рисования.

176

SetStretchBltMode

Устанавливает режим растрового изображения.

177

SetTextAlign

Устанавливает флаги выравнивания текста.

178

SetTextCharacterExtra

Устанавливает количество межсимвольных интервалов.

179

SetTextColor

Устанавливает цвет текста.

180

SetTextJustification

Добавляет пробел к символам разрыва в строке.

181

SetViewportExt

Устанавливает x- и y-экстенты области просмотра.

182

SetViewportOrg

Устанавливает происхождение области просмотра.

183

SetWindowExt

Устанавливает x- и y-экстенты ассоциированного окна.

184

SetWindowOrg

Устанавливает происхождение окна контекста устройства.

185

SetWorldTransform

Устанавливает текущее мировое пространство в преобразование пространства страницы.

186

StartDoc

Сообщает драйверу устройства, что начинается новое задание на печать.

187

Стартовая страница

Информирует драйвер устройства о запуске новой страницы.

188

StretchBlt

Перемещает растровое изображение из исходного прямоугольника и устройства в целевой прямоугольник, растягивая или сжимая растровое изображение, если необходимо, чтобы соответствовать размерам целевого прямоугольника.

189

StrokeAndFillPath

Закрывает все открытые фигуры в контуре, обводит контур контура с помощью текущего пера и заполняет его внутреннее пространство с помощью текущей кисти.

190

Путь инсульта

Визуализирует указанный путь с использованием текущего пера.

191

TabbedTextOut

Записывает строку символов в указанном месте, расширяя вкладки до значений, указанных в массиве позиций табуляции.

192

TextOut

Записывает строку символов в указанном месте, используя текущий выбранный шрифт.

193

TransparentBlt

Переносит битовый блок цветовых данных из указанного контекста исходного устройства в контекст целевого устройства, делая указанный цвет прозрачным при передаче.

194

UpdateColors

Обновляет клиентскую область контекста устройства, сопоставляя текущие цвета в клиентской области с системной палитрой на попиксельной основе.

195

WidenPath

Переопределяет текущий путь как область, которая будет рисоваться, если путь был обведен пером, выбранным в данный момент в контексте устройства.

AbortDoc

Завершает текущее задание на печать, стирая все, что приложение записало на устройство с момента последнего вызова функции- члена StartDoc .

AbortPath

Закрывает и отбрасывает любые пути в контексте устройства.

AddMetaFileComment

Копирует комментарий из буфера в указанный метафайл расширенного формата.

AlphaBlend

Отображает растровые изображения с прозрачными или полупрозрачными пикселями.

AngleArc

Рисует отрезок линии и дугу и перемещает текущую позицию в конечную точку дуги.

дуга

Рисует эллиптическую дугу.

аркто

Рисует эллиптическую дугу. Эта функция похожа на Arc, за исключением того, что текущая позиция обновляется.

Прикреплять

Присоединяет контекст устройства Windows к этому объекту CDC.

BeginPath

Открывает скобку пути в контексте устройства.

BitBlt

Копирует растровое изображение из указанного контекста устройства.

Аккорд

Рисует аккорд (замкнутая фигура, ограниченная пересечением эллипса и отрезка).

CloseFigure

Закрывает открытую фигуру в дорожке.

CreateCompatibleDC

Создает контекст устройства памяти, который совместим с другим контекстом устройства. Вы можете использовать его для подготовки изображений в памяти.

CreateDC

Создает контекст устройства для определенного устройства.

CREATEIC

Создает информационный контекст для конкретного устройства. Это обеспечивает быстрый способ получения информации об устройстве без создания контекста устройства.

DeleteDC

Удаляет контекст устройства Windows, связанный с этим объектом CDC.

DeleteTempMap

Вызывается простым обработчиком CWinApp для удаления любого временного объекта CDC, созданного FromHandle. Также отключает контекст устройства.

отрывать

Отсоединяет контекст устройства Windows от этого объекта CDC.

DPtoHIMETRIC

Преобразует единицы измерения устройства в единицы HIMETRIC .

DPtoLP

Преобразует единицы устройства в логические единицы.

Draw3dRect

Рисует трехмерный прямоугольник.

DrawDragRect

Стирает и перерисовывает прямоугольник при его перетаскивании.

DrawEdge

Рисует края прямоугольника.

DrawEscape

Доступ к возможностям рисования видео дисплея, которые не доступны напрямую через интерфейс графического устройства (GDI).

DrawFocusRect

Рисует прямоугольник в стиле, используемом для обозначения фокуса.

DrawFrameControl

Нарисуйте рамку управления.

DrawIcon

Рисует иконку.

DrawState

Отображает изображение и применяет визуальный эффект, чтобы указать состояние.

DrawText

Рисует форматированный текст в указанном прямоугольнике.

DrawTextEx

Рисует форматированный текст в указанном прямоугольнике, используя дополнительные форматы.

Эллипс

Рисует эллипс

EndDoc

Завершает задание печати, запущенное функцией-членом StartDoc.

EndPage

Сообщает драйверу устройства, что страница заканчивается.

EndPath

Закрывает скобку пути и выбирает путь, определенный скобкой, в контекст устройства.

EnumObjects

Перечисляет ручки и кисти, доступные в контексте устройства.

Побег

Позволяет приложениям получать доступ к средствам, которые не доступны напрямую с определенного устройства через GDI. Также позволяет доступ к функциям побега Windows. Escape-вызовы, сделанные приложением, переводятся и отправляются драйверу устройства.

ExcludeClipRect

Создает новую область отсечения, которая состоит из существующей области отсечения минус указанный прямоугольник.

ExcludeUpdateRgn

Предотвращает рисование в недопустимых областях окна, исключая обновленную область в окне из области отсечения.

ExtFloodFill

Заполняет область текущей кистью. Обеспечивает большую гибкость, чем функция- член FloodFill .

ExtTextOut

Записывает строку символов в прямоугольной области, используя текущий выбранный шрифт.

FillPath

Закрывает все открытые фигуры в текущем пути и заполняет внутреннюю часть пути, используя текущую кисть и режим полигонального заполнения.

FillRect

Заполняет данный прямоугольник с помощью определенной кисти.

FillRgn

Заполняет определенный регион указанной кистью.

FillSolidRect

Заполняет прямоугольник сплошным цветом.

FlattenPath

Преобразует любые кривые на выбранном пути в текущий контекст устройства и превращает каждую кривую в последовательность линий.

Заливка

Заполняет область текущей кистью.

FrameRect

Рисует рамку вокруг прямоугольника.

FrameRgn

Рисует границу вокруг определенной области с помощью кисти.

FromHandle

Возвращает указатель на объект CDC, когда ему дается дескриптор контекста устройства. Если объект CDC не прикреплен к дескриптору, создается и присоединяется временный объект CDC.

GetArcDirection

Возвращает текущее направление дуги для контекста устройства.

GetAspectRatioFilter

Получает настройку для текущего фильтра соотношения сторон.

GetBkColor

Получает текущий цвет фона.

GetBkMode

Получает фоновый режим.

GetBoundsRect

Возвращает текущий накопленный ограничивающий прямоугольник для указанного контекста устройства.

GetBrushOrg

Получает источник текущей кисти.

GetCharABCWidths

Извлекает ширину в логических единицах последовательных символов в заданном диапазоне из текущего шрифта.

GetCharABCWidthsI

Извлекает ширину в логических единицах последовательных индексов глифов в указанном диапазоне из текущего шрифта TrueType.

GetCharacterPlacement

Получает различные типы информации о символьной строке.

GetCharWidth

Извлекает дробные ширины последовательных символов в заданном диапазоне из текущего шрифта.

GetCharWidthI

Извлекает ширину в логических координатах последовательных индексов глифов в указанном диапазоне из текущего шрифта.

GetClipBox

Извлекает размеры самого тесного ограничивающего прямоугольника вокруг текущей границы отсечения.

GetColorAdjustment

Получает значения регулировки цвета для контекста устройства.

GetCurrentBitmap

Возвращает указатель на текущий выбранный объект CBitmap .

GetCurrentBrush

Возвращает указатель на текущий выбранный объект CBrush .

GetCurrentFont

Возвращает указатель на текущий выбранный объект CFont .

GetCurrentPalette

Возвращает указатель на текущий выбранный объект CPalette .

GetCurrentPen

Возвращает указатель на текущий выбранный объект CPen .

GetCurrentPosition

Получает текущее положение пера (в логических координатах).

GetDCBrushColor

Получает текущий цвет кисти.

GetDCPenColor

Получает текущий цвет пера.

GetDeviceCaps

Извлекает определенный вид специфической для устройства информации о возможностях данного устройства отображения.

GetFontData

Извлекает информацию о метрике шрифта из файла масштабируемого шрифта. Информация для извлечения идентифицируется путем указания смещения в файле шрифта и длины возвращаемой информации.

GetFontLanguageInfo

Возвращает информацию о текущем выбранном шрифте для указанного контекста дисплея.

GetGlyphOutline

Извлекает контурную кривую или растровое изображение для символа контура в текущем шрифте.

GetGraphicsMode

Получает текущий графический режим для указанного контекста устройства.

GetHalftoneBrush

Получает полутоновую кисть.

GetKerningPairs

Извлекает пары символов кернинга для шрифта, выбранного в данный момент в указанном контексте устройства.

GetLayout

Получает макет контекста устройства (DC). Макет может быть слева направо (по умолчанию) или справа налево (зеркально отображено).

GetMapMode

Получает текущий режим отображения.

GetMiterLimit

Возвращает ограничение митры для контекста устройства.

GetNearestColor

Извлекает ближайший логический цвет к указанному логическому цвету, который может представлять данное устройство.

GetOutlineTextMetrics

Извлекает информацию о метрике шрифта для шрифтов TrueType.

GetOutputCharWidth

Извлекает ширину отдельных символов в последовательной группе символов из текущего шрифта, используя контекст устройства вывода.

GetOutputTabbedTextExtent

Вычисляет ширину и высоту строки символов в контексте устройства вывода.

GetOutputTextExtent

Вычисляет ширину и высоту строки текста в контексте устройства вывода, используя текущий шрифт для определения размеров.

GetOutputTextMetrics

Извлекает метрики для текущего шрифта из контекста устройства вывода.

GetPath

Извлекает координаты, определяющие конечные точки линий и контрольные точки кривых, найденных на пути, выбранном в контексте устройства.

GetPixel

Получает значение цвета RGB пикселя в указанной точке.

GetPolyFillMode

Получает текущий режим заполнения полигонов.

GetROP2

Получает текущий режим рисования.

GetSafeHdc

Возвращает m_hDC , контекст устройства вывода.

GetStretchBltMode

Получает текущий режим растрового изображения.

GetTabbedTextExtent

Вычисляет ширину и высоту строки символов в контексте устройства атрибута.

GetTextAlign

Получает флаги выравнивания текста.

GetTextCharacterExtra

Извлекает текущую настройку для интервала между символами.

GetTextColor

Получает текущий цвет текста.

GetTextExtent

Вычисляет ширину и высоту строки текста в контексте устройства атрибута, используя текущий шрифт для определения размеров.

GetTextExtentExPointI

Извлекает количество символов в указанной строке, которые поместятся в указанном пространстве, и заполняет массив текстовым экстентом для каждого из этих символов.

GetTextExtentPointI

Получает ширину и высоту указанного массива индексов глифов.

GetTextFace

Копирует имя гарнитуры текущего шрифта в буфер в виде строки с нулевым символом в конце.

GetTextMetrics

Извлекает метрики для текущего шрифта из атрибута контекста устройства.

GetViewportExt

Извлекает x- и y-экстенты области просмотра.

GetViewportOrg

Получает x- и y-координаты источника области просмотра.

GetWindow

Возвращает окно, связанное с контекстом устройства отображения.

GetWindowExt

Извлекает x- и y-экстенты связанного окна.

GetWindowOrg

Получает x- и y-координаты источника связанного окна.

GetWorldTransform

Извлекает текущее преобразование пространства мира в пространство страниц.

GradientFill

Заполняет прямоугольные и треугольные структуры градуирующим цветом.

GrayString

Рисует затемненный (серый) текст в заданном месте.

HIMETRICtoDP

Преобразует единицы HIMETRIC в единицы устройства.

HIMETRICtoLP

Преобразует HIMETRIC единицы в логические единицы.

IntersectClipRect

Создает новую область отсечения, формируя пересечение текущей области и прямоугольника.

InvertRect

Инвертирует содержимое прямоугольника.

InvertRgn

Инвертирует цвета в регионе.

IsPrinting

Определяет, используется ли контекст устройства для печати.

LineTo

Рисует линию от текущей позиции до, но не включая точку.

LPtoDP

Преобразует логические единицы в единицы устройства.

LPtoHIMETRIC

Преобразует логические единицы в ХИМЕТРИЧЕСКИЕ единицы.

MaskBlt

Объединяет данные цвета для исходных и целевых растровых изображений с использованием заданной маски и растровой операции.

ModifyWorldTransform

Изменяет трансформацию мира для контекста устройства, используя указанный режим.

MoveTo

Перемещает текущую позицию.

OffsetClipRgn

Перемещает область отсечения данного устройства.

OffsetViewportOrg

Изменяет начало области просмотра относительно координат текущего источника просмотра.

OffsetWindowOrg

Изменяет начало окна относительно координат текущего источника окна.

PaintRgn

Заполняет область выбранной кистью.

PatBlt

Создает немного шаблон.

пирог

Рисует пирог в форме клина.

PlayMetaFile

Воспроизведение содержимого указанного метафайла на данном устройстве. Расширенная версия PlayMetaFile отображает изображение, хранящееся в данном метафайле расширенного формата. Метафайл может быть воспроизведен любое количество раз.

PlgBlt

Выполняет передачу битового блока битов цветовых данных из указанного прямоугольника в контексте исходного устройства в указанный параллелограмм в данном контексте устройства.

PolyBezier

Рисует один или несколько сплайнов Безье. Текущая позиция не используется и не обновляется.

PolyBezierTo

Рисует один или несколько сплайнов Bzier и перемещает текущую позицию в конечную точку последнего сплайна Bzier.

PolyDraw

Рисует набор отрезков линии и сплайнов Бзье. Эта функция обновляет текущую позицию.

многоугольник

Рисует многоугольник, состоящий из двух или более точек (вершин), соединенных линиями.

Ломаная

Рисует набор отрезков, соединяющих указанные точки.

PolylineTo

Рисует одну или несколько прямых линий и перемещает текущую позицию в конечную точку последней линии.

PolyPolygon

Создает два или более полигонов, которые заполнены, используя текущий режим заполнения полигонов. Полигоны могут быть непересекающимися или могут перекрываться.

PolyPolyline

Рисует несколько серий соединенных отрезков. Текущая позиция не используется и не обновляется этой функцией.

PtVisible

Указывает, находится ли данная точка в области отсечения.

RealizePalette

Сопоставляет записи палитры в текущей логической палитре с системной палитрой.

Прямоугольник

Рисует прямоугольник, используя текущее перо, и заполняет его, используя текущую кисть.

RectVisible

Определяет, находится ли какая-либо часть данного прямоугольника в области отсечения.

ReleaseAttribDC

Выпускает m_hAttribDC , атрибут устройства контекста.

ReleaseOutputDC

Выпускает m_hDC , контекст устройства вывода.

ResetDC

Обновляет контекст устройства m_hAttribDC.

RestoreDC

Восстанавливает контекст устройства в предыдущее состояние, сохраненное с помощью SaveDC .

ROUNDRECT

Рисует прямоугольник с закругленными углами, используя текущее перо, и заливает, используя текущую кисть.

SaveDC

Сохраняет текущее состояние контекста устройства.

ScaleViewportExt

Изменяет экстент области просмотра относительно текущих значений.

ScaleWindowExt

Изменяет экстенты окна относительно текущих значений.

ScrollDC

Прокручивает прямоугольник бит по горизонтали и вертикали.

SelectClipPath

Выбирает текущий путь в качестве области отсечения для контекста устройства, комбинируя новую область с любой существующей областью отсечения, используя указанный режим.

SelectClipRgn

Объединяет данную область с текущей областью отсечения, используя указанный режим.

SelectObject

Выбирает объект рисования GDI, например, перо.

SelectPalette

Выбирает логическую палитру.

SelectStockObject

Выбирает одну из предопределенных стандартных ручек, кистей или шрифтов, предоставляемых Windows.

SetAbortProc

Устанавливает функцию обратного вызова, предоставляемую программистом, которую Windows вызывает, если задание на печать должно быть прервано.

SetArcDirection

Устанавливает направление рисования, которое будет использоваться для функций дуги и прямоугольника.

SetAttribDC

Устанавливает m_hAttribDC, атрибут устройства контекста.

SetBkColor

Устанавливает текущий цвет фона.

SetBkMode

Устанавливает режим фона.

SetBoundsRect

Управляет накоплением информации о ограничительном прямоугольнике для указанного контекста устройства.

SetBrushOrg

Определяет источник для следующей кисти, выбранной в контексте устройства.

SetColorAdjustment

Устанавливает значения регулировки цвета для контекста устройства, используя указанные значения.

SetDCBrushColor

Устанавливает текущий цвет кисти.

SetDCPenColor

Устанавливает текущий цвет пера.

SetGraphicsMode

Устанавливает текущий графический режим для указанного контекста устройства.

SetLayout

Изменяет макет контекста устройства (DC).

SetMapMode

Устанавливает текущий режим отображения.

SetMapperFlags

Изменяет алгоритм, используемый сопоставителем шрифтов при сопоставлении логических шрифтов с физическими шрифтами.

SetMiterLimit

Устанавливает ограничение длины соединений митры для контекста устройства.

SetOutputDC

Устанавливает m_hDC, контекст устройства вывода.

SetPixel

Устанавливает пиксель в указанной точке в ближайшее приближение указанного цвета.

SetPixelV

Устанавливает пиксель в указанных координатах в ближайшее приближение указанного цвета. SetPixelV работает быстрее, чем SetPixel, поскольку ему не нужно возвращать значение цвета фактически нарисованной точки.

SetPolyFillMode

Устанавливает режим заполнения полигонов.

SetROP2

Устанавливает текущий режим рисования.

SetStretchBltMode

Устанавливает режим растрового изображения.

SetTextAlign

Устанавливает флаги выравнивания текста.

SetTextCharacterExtra

Устанавливает количество межсимвольных интервалов.

SetTextColor

Устанавливает цвет текста.

SetTextJustification

Добавляет пробел к символам разрыва в строке.

SetViewportExt

Устанавливает x- и y-экстенты области просмотра.

SetViewportOrg

Устанавливает происхождение области просмотра.

SetWindowExt

Устанавливает x- и y-экстенты ассоциированного окна.

SetWindowOrg

Устанавливает происхождение окна контекста устройства.

SetWorldTransform

Устанавливает текущее мировое пространство в преобразование пространства страницы.

StartDoc

Сообщает драйверу устройства, что начинается новое задание на печать.

Стартовая страница

Информирует драйвер устройства о запуске новой страницы.

StretchBlt

Перемещает растровое изображение из исходного прямоугольника и устройства в целевой прямоугольник, растягивая или сжимая растровое изображение, если необходимо, чтобы соответствовать размерам целевого прямоугольника.

StrokeAndFillPath

Закрывает все открытые фигуры в контуре, обводит контур контура с помощью текущего пера и заполняет его внутреннее пространство с помощью текущей кисти.

Путь инсульта

Визуализирует указанный путь с использованием текущего пера.

TabbedTextOut

Записывает строку символов в указанном месте, расширяя вкладки до значений, указанных в массиве позиций табуляции.

TextOut

Записывает строку символов в указанном месте, используя текущий выбранный шрифт.

TransparentBlt

Переносит битовый блок цветовых данных из указанного контекста исходного устройства в контекст целевого устройства, делая указанный цвет прозрачным при передаче.

UpdateColors

Обновляет клиентскую область контекста устройства, сопоставляя текущие цвета в клиентской области с системной палитрой на попиксельной основе.

WidenPath

Переопределяет текущий путь как область, которая будет рисоваться, если путь был обведен пером, выбранным в данный момент в контексте устройства.

линии

Шаг 1 — Давайте рассмотрим простой пример, создав новый проект с одним документом на основе MFC с именем MFCGDIDemo .

линии

Шаг 2. После создания проекта откройте обозреватель решений и дважды щелкните файл MFCGDIDemoView.cpp в папке «Исходные файлы».

Шаг 3 — Нарисуйте линию, как показано ниже в методе CMFCGDIDemoView :: OnDraw () .

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->MoveTo(95, 125);
   pDC->LineTo(230, 125);
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

Шаг 4 — Запустите это приложение. Вы увидите следующий вывод.

линии

Шаг 5 — Метод CDC :: MoveTo () используется для установки начальной позиции строки.

При использовании LineTo () программа запускается от точки MoveTo () до конца LineTo ().

После LineTo (), когда вы не вызываете MoveTo () и снова вызываете LineTo () с другим значением точки, программа нарисует линию от предыдущего LineTo () до новой точки LineTo ().

Шаг 6 — Чтобы нарисовать разные линии, вы можете использовать это свойство, как показано в следующем коде.

void CMFCGDIDemoView::OnDraw(CDC* pDC) { 
   pDC->MoveTo(95, 125);
   pDC->LineTo(230, 125);
   pDC->LineTo(230, 225);
   pDC->LineTo(95, 325);
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here 
}

Шаг 7 — Запустите это приложение. Вы увидите следующий вывод.

линии

Ломаные

Полилиния — это серия связанных линий. Строки хранятся в массиве значений POINT или CPoint. Чтобы нарисовать полилинию, вы используете метод CDC :: Polyline (). Чтобы нарисовать ломаную линию, требуется как минимум две точки. Если вы определите более двух точек, каждая линия после первой будет проведена от предыдущей точки до следующей, пока все точки не будут включены.

Шаг 1 — Давайте рассмотрим простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   CPoint Pt[7];
   Pt[0] = CPoint(20, 150);
   Pt[1] = CPoint(180, 150);
   Pt[2] = CPoint(180, 20);
   pDCPolyline(Pt, 3);
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

Шаг 2 — Когда вы запустите это приложение, вы увидите следующий вывод.

Ломаные

Прямоугольники

Прямоугольник — это геометрическая фигура, состоящая из четырех сторон, которые составляют четыре прямых угла. Подобно линии, чтобы нарисовать прямоугольник, вы должны определить, где он начинается и где он заканчивается. Чтобы нарисовать прямоугольник, вы можете использовать метод CDC :: Rectangle ().

Шаг 1 — Давайте рассмотрим простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->Rectangle(15, 15, 250, 160);
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

Шаг 2 — Когда вы запустите это приложение, вы увидите следующий вывод.

Прямоугольники

Квадраты

Квадрат — это геометрическая фигура, состоящая из четырех сторон, составляющих четыре прямых угла, но каждая сторона должна быть одинаковой длины.

Давайте посмотрим на простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->Rectangle(15, 15, 250, 250);
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

Когда вы запустите это приложение, вы увидите следующий вывод.

Квадраты

Пироги

Пирог — это часть эллипса, ограниченная двумя линиями, которые проходят от центра эллипса к одной стороне каждой. Чтобы нарисовать круговую диаграмму, вы можете использовать метод CDC :: Pie (), как показано ниже —

BOOL Pie (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);

  • Точка (x1, y1) определяет левый верхний угол прямоугольника, в который помещается эллипс, представляющий круговую диаграмму. Точка (x2, y2) — это правый нижний угол прямоугольника.

Точка (x1, y1) определяет левый верхний угол прямоугольника, в который помещается эллипс, представляющий круговую диаграмму. Точка (x2, y2) — это правый нижний угол прямоугольника.

Пироги

  • Точка (x3, y3) указывает начальный угол круговой диаграммы в направлении по умолчанию против часовой стрелки.

  • Точка (x4, y4) определяет конечную точку пирога.

Точка (x3, y3) указывает начальный угол круговой диаграммы в направлении по умолчанию против часовой стрелки.

Точка (x4, y4) определяет конечную точку пирога.

Давайте посмотрим на простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->Pie(40, 20, 226, 144, 155, 32, 202, 115);
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

Шаг 2 — Когда вы запустите это приложение, вы увидите следующий вывод.

Пироги

Дуги

Дуга — это часть или сегмент эллипса, что означает, что дуга является неполным эллипсом. Чтобы нарисовать дугу, вы можете использовать метод CDC :: Arc ().

BOOL Arc (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);

Дуги

Класс CDC оснащен методом SetArcDirection ().

Вот синтаксис —

int SetArcDirection(int nArcDirection)

Sr.No. Ценность и ориентация
1

AD_CLOCKWISE

Фигура нарисована по часовой стрелке

2

AD_COUNTERCLOCKWISE

Фигура нарисована против часовой стрелки

AD_CLOCKWISE

Фигура нарисована по часовой стрелке

AD_COUNTERCLOCKWISE

Фигура нарисована против часовой стрелки

Шаг 1 — Давайте рассмотрим простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->SetArcDirection(AD_COUNTERCLOCKWISE);
   pDC->Arc(20, 20, 226, 144, 202, 115, 105, 32);
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

Шаг 2 — Когда вы запустите это приложение, вы увидите следующий вывод.

Дуги

Аккорды

Дуги, которые мы нарисовали до сих пор, считаются открытыми фигурами, потому что они состоят из линии, у которой есть начало и конец (в отличие от круга или прямоугольника, у которых его нет). Аккорд — это дуга, два конца которой соединены прямой линией.

Аккорды

Чтобы нарисовать аккорд, вы можете использовать метод CDC :: Chord ().

BOOL Chord (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);

Давайте посмотрим на простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   pDC->SetArcDirection(AD_CLOCKWISE);
   pDC->Chord(20, 20, 226, 144, 202, 115, 105, 32);
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

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

Аккорды

Направление дуги в этом примере задается по часовой стрелке.

Цвета

Цвет — один из самых фундаментальных объектов, который улучшает эстетический вид объекта. Цвет — это непространственный объект, который добавляется к объекту для изменения некоторых его визуальных аспектов. Библиотека MFC в сочетании с Win32 API предоставляет различные действия, которые вы можете использовать, чтобы воспользоваться различными аспектами цветов.

Макрос RGB ведет себя как функция и позволяет передавать три числовых значения через запятую. Каждое значение должно быть от 0 до 255, как показано в следующем коде.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   COLORREF color = RGB(239, 15, 225);
}

Давайте посмотрим на простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   COLORREF color = RGB(239, 15, 225);
   pDC->SetTextColor(color);
   pDC->TextOut(100, 80, L"MFC GDI Tutorial", 16);
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

Когда вы запустите это приложение, вы увидите следующий вывод.

Цвета

шрифты

CFont инкапсулирует шрифт интерфейса графического устройства Windows (GDI) и предоставляет функции-члены для управления шрифтом. Чтобы использовать объект CFont, создайте объект CFont и присоедините к нему шрифт Windows, а затем используйте функции-члены объекта для управления шрифтом.

CreateFont

Инициализирует CFont с указанными характеристиками.

CreateFontIndirect

Инициализирует объект CFont с характеристиками, заданными в структуре LOGFONT .

CreatePointFont

Инициализирует CFont с указанной высотой, измеряемой в десятых долях точки, и гарнитурой.

CreatePointFontIndirect

То же, что CreateFontIndirect, за исключением того, что высота шрифта измеряется в десятых долях точки, а не в логических единицах.

FromHandle

Возвращает указатель на объект CFont при получении Windows HFONT .

GetLogFont

Заполняет LOGFONT информацией о логическом шрифте, прикрепленном к объекту CFont.

Давайте посмотрим на простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   CFont font;
   font.CreatePointFont(920, L"Garamond");
   CFont *pFont = pDC->SelectObject(&font);
   COLORREF color = RGB(239, 15, 225);
   pDC->SetTextColor(color);
   pDC->TextOut(100, 80, L"MFC GDI Tutorial", 16);
   pDC->SelectObject(pFont);
   font.DeleteObject();
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
   return;

   // TODO: add draw code for native data here
}

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

шрифты

Ручки

Ручка — это инструмент, используемый для рисования линий и кривых в контексте устройства. В графическом программировании перо также используется для рисования границ геометрической замкнутой формы, такой как прямоугольник или многоугольник. Microsoft Windows рассматривает два типа ручек — косметические и геометрические .

Ручка называется косметической, когда она может использоваться для рисования только простых линий фиксированной ширины, меньшей или равной 1 пикселю. Ручка является геометрической, когда она может иметь разную ширину и разные концы. MFC предоставляет класс CPen, который инкапсулирует перо интерфейса графического устройства Windows (GDI).

CreatePen

Создает логическое косметическое или геометрическое перо с указанными атрибутами стиля, ширины и кисти и присоединяет его к объекту CPen.

CreatePenIndirect

Создает перо со стилем, шириной и цветом, заданным в структуре LOGPEN, и прикрепляет его к объекту CPen.

FromHandle

Возвращает указатель на объект CPen при наличии Windows HPEN .

GetExtLogPen

Получает EXTLOGPEN базовую структуру.

GetLogPen

Получает базовую структуру LOGPEN .

PS_SOLID

Сплошная сплошная линия.

PS_DASH

Сплошная линия с пунктирными прерываниями.

PS_DOT

Линия с точечным прерыванием на каждом втором пикселе.

PS_DASHDOT

Комбинация чередующихся пунктирных и пунктирных точек.

PS_DASHDOTDOT

Комбинация прерываний из тире и двойных точек.

PS_NULL

Нет видимой линии.

PS_INSIDEFRAME

Линия, проведенная прямо внутри границы замкнутой формы.

Давайте посмотрим на простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   CPen pen;
   pen.CreatePen(PS_DASHDOTDOT, 1, RGB(160, 75, 90));
   pDC->SelectObject(&pen);
   pDC->Rectangle(25, 35, 250, 125);
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

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

Ручки

Кисти

Кисть — это инструмент для рисования, используемый для заполнения замкнутых фигур или внутренних линий. Кисть ведет себя как собирание ведра краски и заливка его куда-то. MFC предоставляет класс CBrush, который инкапсулирует кисть интерфейса графического устройства Windows (GDI).

CreateBrushIndirect

Инициализирует кисть со стилем, цветом и рисунком, указанными в структуре LOGBRUSH.

CreateDIBPatternBrush

Инициализирует кисть с шаблоном, заданным независимым от устройства растровым изображением (DIB).

CreateHatchBrush

Инициализирует кисть с указанным штрихованным рисунком и цветом.

CreatePatternBrush

Инициализирует кисть с шаблоном, заданным растровым изображением.

CreateSolidBrush

Инициализирует кисть с указанным сплошным цветом.

CreateSysColorBrush

Создает кисть, которая является системным цветом по умолчанию.

FromHandle

Возвращает указатель на объект CBrush, когда передается дескриптор объекта Windows HBRUSH.

GetLogBrush

Получает структуру LOGBRUSH.

Давайте посмотрим на простой пример.

void CMFCGDIDemoView::OnDraw(CDC* pDC) {
   CBrush brush(RGB(100, 150, 200));
   CBrush *pBrush = pDC->SelectObject(&brush);
   pDC->Rectangle(25, 35, 250, 125);
   pDC->SelectObject(pBrush);
   
   CMFCGDIDemoDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   if (!pDoc)
      return;

   // TODO: add draw code for native data here
}

Когда вы запустите это приложение, вы увидите следующий вывод.

Кисти

МФЦ — Библиотеки

Библиотека — это группа функций, классов или других ресурсов, которые можно сделать доступными для программ, которым требуются уже реализованные объекты, без необходимости знать, как были созданы эти функции, классы или ресурсы или как они функционируют. Библиотека облегчает программисту использование функций, классов, ресурсов и т. Д., Созданных другим человеком или компанией, и верит, что этот внешний источник надежен и эффективен. Некоторые уникальные особенности, связанные с библиотеками:

  • Библиотека создается и функционирует как обычная обычная программа, используя функции или другие ресурсы и взаимодействуя с другими программами.

  • Для реализации своих функций библиотека содержит функции, которые необходимы другим программам для завершения их функций.

  • В то же время библиотека может использовать некоторые функции, которые не нужны другим программам.

  • Программы, использующие библиотеку, также называются клиентами библиотеки.

Библиотека создается и функционирует как обычная обычная программа, используя функции или другие ресурсы и взаимодействуя с другими программами.

Для реализации своих функций библиотека содержит функции, которые необходимы другим программам для завершения их функций.

В то же время библиотека может использовать некоторые функции, которые не нужны другим программам.

Программы, использующие библиотеку, также называются клиентами библиотеки.

Существует два типа функций, которые вы будете создавать или включать в свои библиотеки:

  • Внутренняя функция — это функция, используемая только самой библиотекой, и клиентам библиотеки не потребуется доступ к этим функциям.

  • Внешние функции — это те, к которым могут обращаться клиенты библиотеки.

Внутренняя функция — это функция, используемая только самой библиотекой, и клиентам библиотеки не потребуется доступ к этим функциям.

Внешние функции — это те, к которым могут обращаться клиенты библиотеки.

Есть две широкие категории библиотек, с которыми вы будете иметь дело в своих программах:

  • Статические библиотеки
  • Динамические библиотеки

Статическая библиотека

Статическая библиотека — это файл, содержащий функции, классы или ресурсы, которые внешняя программа может использовать для дополнения своих функций. Чтобы использовать библиотеку, программист должен создать ссылку на нее. Проект может быть консольным приложением, приложением Win32 или MFC. Файл библиотеки имеет расширение lib.

Шаг 1 — Давайте рассмотрим простой пример статической библиотеки, создав новый проект Win32.

Статическая библиотека

Шаг 2 — В диалоговом окне «Мастер приложений» выберите параметр «Статическая библиотека».

Статическая библиотека

Шаг 3 — Нажмите Готово, чтобы продолжить.

Статическая библиотека

Шаг 4 — Щелкните правой кнопкой мыши проект в обозревателе решений и добавьте файл заголовка из пункта меню Добавить → Новый элемент….

Статическая библиотека

Шаг 5 — Введите Calculator.h в поле Имя и нажмите Добавить.

Добавьте следующий код в заголовочный файл —

#pragma once
#ifndef _CALCULATOR_H_
#define _CALCULATOR_H_
double Min(const double *Numbers, const int Count);
double Max(const double *Numbers, const int Count);
double Sum(const double *Numbers, const int Count);
double Average(const double *Numbers, const int Count);
long GreatestCommonDivisor(long Nbr1, long Nbr2);
#endif // _CALCULATOR_H_

Шаг 6 — Добавьте исходный (* .cpp) файл в проект.

Статическая библиотека

Шаг 7 — Введите Calculator.cpp в поле Имя и нажмите Добавить.

Шаг 8 — Добавьте следующий код в файл * .cpp —

#include "StdAfx.h"
#include "Calculator.h"
double Min(const double *Nbr, const int Total) {
   double Minimum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Minimum > Nbr[i])
         Minimum = Nbr[i];
   return Minimum;
}
double Max(const double *Nbr, const int Total) {
   double Maximum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Maximum < Nbr[i])
         Maximum = Nbr[i];
   return Maximum;
}
double Sum(const double *Nbr, const int Total) {
   double S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   return S;
}
double Average(const double *Nbr, const int Total) {
   double avg, S = 0;
   for (int i = 0; i < Total; i++)
       S += Nbr[i];
   avg = S / Total;
   return avg;
}
long GreatestCommonDivisor(long Nbr1, long Nbr2) {
   while (true) {
      Nbr1 = Nbr1 % Nbr2;
      if (Nbr1 == 0)
         return Nbr2;
      Nbr2 = Nbr2 % Nbr1;
      if (Nbr2 == 0)
         return Nbr1;
   }
}

Шаг 9 — Создайте эту библиотеку из главного меню, нажав Build → Build MFCLib .

Статическая библиотека

Шаг 10 — Когда библиотека будет успешно построена, на ней появится вышеуказанное сообщение.

Шаг 11 — Чтобы использовать эти функции из библиотеки, давайте добавим еще одно диалоговое приложение MFC на основе Файл → Создать → Проект.

Статическая библиотека

Шаг 12. Перейдите в папку MFCLib \ Debug и скопируйте файл заголовка и файлы * .lib в проект MFCLibTest, как показано на следующем снимке.

Статическая библиотека

Шаг 13 — Чтобы добавить библиотеку в текущий проект, в главном меню выберите «Проект» → «Добавить существующий элемент» и выберите «MFCLib.lib».

Шаг 14 — Создайте диалоговое окно, как показано на следующем снимке.

Статическая библиотека

Шаг 15 — Добавьте переменную значения для обоих элементов управления редактирования типа значения double.

Статическая библиотека

Шаг 16 — Добавьте переменную значения для статического текстового элемента управления, который находится в конце диалогового окна.

Статическая библиотека

Шаг 17 — Добавьте обработчик события для кнопки «Рассчитать».

Чтобы добавить функциональность из библиотеки, нам нужно включить файл заголовка в файл CMFCLibTestDlg.cpp.

#include "stdafx.h"
#include "MFCLibTest.h"
#include "MFCLibTestDlg.h"
#include "afxdialogex.h"
#include "Calculator.h"

Шаг 18 — Вот реализация обработчика события кнопки.

void CMFCLibTestDlg::OnBnClickedButtonCal() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   CString strTemp;
   double numbers[2];
   numbers[0] = m_Num1;
   numbers[1] = m_Num2;

   strTemp.Format(L"%.2f", Max(numbers,2));
   m_strText.Append(L"Max is:\t" + strTemp);

   strTemp.Format(L"%.2f", Min(numbers, 2));
   m_strText.Append(L"\nMin is:\t" + strTemp);
   
   strTemp.Format(L"%.2f", Sum(numbers, 2));
   m_strText.Append(L"\nSum is:\t" + strTemp);

   strTemp.Format(L"%.2f", Average(numbers, 2));
   m_strText.Append(L"\nAverage is:\t" + strTemp);

   strTemp.Format(L"%d", GreatestCommonDivisor(m_Num1, m_Num2));
   m_strText.Append(L"\nGDC is:\t" + strTemp);

   UpdateData(FALSE);
}

Шаг 19 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Статическая библиотека

Шаг 20 — Введите два значения в поле редактирования и нажмите «Рассчитать». Теперь вы увидите результат после расчета из библиотеки.

Статическая библиотека

Динамическая библиотека

Win32 DLL — это библиотека, которую можно сделать доступной для программ, работающих на компьютере под управлением Microsoft Windows. Как обычная библиотека, она состоит из функций и / или других ресурсов, сгруппированных в файле.

Аббревиатура DLL расшифровывается как Dynamic Link Library. Это означает, что в отличие от статической библиотеки, DLL позволяет программисту решать, когда и как другие приложения будут связаны с библиотекой этого типа.

Например, DLL позволяет разным приложениям использовать свою библиотеку по своему усмотрению и по мере необходимости. Фактически, приложения, созданные в разных средах программирования, могут использовать функции или ресурсы, хранящиеся в одной конкретной DLL. По этой причине приложение динамически связывается с библиотекой.

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

Динамическая библиотека

Шаг 2 — В разделе «Тип приложения» щелкните переключатель DLL.

Динамическая библиотека

Шаг 3 — Нажмите Готово, чтобы продолжить.

Шаг 4 — Добавьте следующие функции в файл MFCDynamicLib.cpp и предоставьте его определения, используя —

extern "C" _declspec(dllexport)

Шаг 5 — Используйте модификатор _declspec (dllexport) для каждой функции, к которой будет обращаться за пределами DLL.

// MFCDynamicLib.cpp : Defines the exported functions for the DLL application.//

#include "stdafx.h"

extern "C" _declspec(dllexport) double Min(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Max(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Sum(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Average(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) long GreatestCommonDivisor(long Nbr1, long Nbr2);

double Min(const double *Nbr, const int Total) {
   double Minimum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Minimum > Nbr[i])
         Minimum = Nbr[i];
   return Minimum;
}
double Max(const double *Nbr, const int Total) {
   double Maximum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Maximum < Nbr[i])
         Maximum = Nbr[i];
   return Maximum;
}
double Sum(const double *Nbr, const int Total) {
   double S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   return S;
}
double Average(const double *Nbr, const int Total){
   double avg, S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   avg = S / Total;
   return avg;
}
long GreatestCommonDivisor(long Nbr1, long Nbr2) {
   while (true) {
      Nbr1 = Nbr1 % Nbr2;
      if (Nbr1 == 0)
         return Nbr2;
      Nbr2 = Nbr2 % Nbr1;
      if (Nbr2 == 0)
         return Nbr1;
   }
}

Шаг 6 — Чтобы создать DLL, в главном меню выберите Build> Build MFCDynamicLib из главного меню.

Динамическая библиотека

Шаг 7 — После того, как DLL успешно создана, вы увидите отображение сообщения в окне вывода.

Шаг 8 — Откройте проводник Windows, а затем папку «Отладка» текущего проекта.

Шаг 9 — Обратите внимание, что был создан файл с расширением dll и другой файл с расширением lib.

Динамическая библиотека

Шаг 10 — Чтобы протестировать этот файл с расширением dll, нам нужно создать новое диалоговое приложение MFC из меню Файл → Создать → Проект.

Динамическая библиотека

Шаг 11 — Перейдите в папку MFCDynamicLib \ Debug и скопируйте файлы * .dll и * .lib в проект MFCLibTest, как показано на следующем снимке.

Динамическая библиотека

Шаг 12 — Чтобы добавить DLL в текущий проект, в главном меню выберите «Проект» → «Добавить существующий элемент», а затем выберите файл MFCDynamicLib.lib.

Шаг 13 — Создайте диалоговое окно, как показано на следующем снимке.

Динамическая библиотека

Шаг 14 — Добавьте переменную значения для обоих элементов управления редактирования типа значения double.

Динамическая библиотека

Шаг 15 — Добавьте переменную значения для статического текстового элемента управления, который находится в конце диалогового окна.

Динамическая библиотека

Шаг 16 — Добавьте обработчик события для кнопки «Рассчитать».

Шаг 17 — В проекте, использующем DLL, каждая функция, к которой будет осуществляться доступ, должна быть объявлена ​​с использованием модификатора _declspec (dllimport).

Шаг 18 — Добавьте следующее объявление функции в файл MFCLibTestDlg.cpp.

extern "C" _declspec(dllimport) double Min(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Max(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Sum(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Average(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) long GreatestCommonDivisor(long Nbr1, long Nbr2);

Шаг 19 — Вот реализация обработчика события кнопки.

void CMFCLibTestDlg::OnBnClickedButtonCal() {

   // TODO: Add your control notification handler code here
   UpdateData(TRUE);

   CString strTemp;
   double numbers[2];
   numbers[0] = m_Num1;
   numbers[1] = m_Num2;

   strTemp.Format(L"%.2f", Max(numbers,2));
   m_strText.Append(L"Max is:\t" + strTemp);

   strTemp.Format(L"%.2f", Min(numbers, 2));
   m_strText.Append(L"\nMin is:\t" + strTemp);

   strTemp.Format(L"%.2f", Sum(numbers, 2));
   m_strText.Append(L"\nSum is:\t" + strTemp);

   strTemp.Format(L"%.2f", Average(numbers, 2));
   m_strText.Append(L"\nAverage is:\t" + strTemp);

   strTemp.Format(L"%d", GreatestCommonDivisor(m_Num1, m_Num2));
   m_strText.Append(L"\nGDC is:\t" + strTemp);
 
   UpdateData(FALSE);
}

Шаг 20 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Динамическая библиотека

Шаг 21 — Введите два значения в поле редактирования и нажмите «Рассчитать». Теперь вы увидите результат после расчета из DLL.