Учебники

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 — Щелкните правой кнопкой мыши на этом окне. Теперь, когда вы отпустите правую кнопку мыши, на ней отобразится следующее сообщение.