Приложение состоит из различных объектов. В большинстве случаев на компьютере работает несколько приложений, и операционной системе постоянно предлагается выполнить некоторые задания. Поскольку может быть непредсказуемо представлено так много запросов, операционная система оставляет объектам право определять, что они хотят, когда они этого хотят, и какое поведение или результат они ожидают.
обзор
-
Операционная система 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.
Шаг 1 — Чтобы создать проект MFC, щелкните проект правой кнопкой мыши и выберите «Свойства».
Шаг 2 — В левом разделе нажмите Свойства конфигурации → Общие.
Шаг 3 — Выберите «Использовать MFC в Shared DLL» в разделе «Настройки проекта по умолчанию» и нажмите «ОК».
Шаг 4 — Нам нужно добавить новый исходный файл.
Шаг 5 — Щелкните правой кнопкой мыши по вашему проекту и выберите «Добавить» → «Новый элемент».
Шаг 6 — В разделе Шаблоны выберите Файл C ++ (.cpp).
Шаг 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 — Щелкните правой кнопкой мыши на этом окне. Теперь, когда вы отпустите правую кнопку мыши, на ней отобразится следующее сообщение.