C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 5. Обработка сообщений / Уроки MFC / Visual C++

Visual C++. MFC
Урок 5. Обработка сообщений

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

Для этого в наш класс вставьте следующий строчки:

class CMyMainWnd : public CFrameWnd{
public:
    CMyMainWnd(){
        Create(NULL,"My title");
    }
    afx_msg void OnLButtonDown(UINT, CPoint);
    DECLARE_MESSAGE_MAP()
};

Далее после класса напишите

BEGIN_MESSAGE_MAP(CMyMainWnd, CFrameWnd)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

И, наконец, в конце файла добавьте строки

CMyApp theApp;
void CMyMainWnd::OnLButtonDown(UINT, CPoint){
    AfxMessageBox("Левая кнопка мыши");
}

Откомпилируйте приложение. При нажатии левой кнопки мыши в окне должен выскочить MessageBox с надписью "Левая кнопка мыши".

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

Первое. Мы должны вставить в конец нашего класса макрос DECLARE_MESSAGE_MAP(). Это достаточно сделать один раз. Этат макрос в классе и означает, что этот класс будет реагировать на некоторые сообщения.

Второе. Мы должны где-то после класса добавить два макроса BEGIN_MESSAGE_MAP(...,...) и END_MESSAGE_MAP(). Это тоже достаточно сделать только один раз. Это так называемая карта сообщений. В первый макрос первым параметром вы должны вставить имя вашего класса, вторым - имя родительского класса. Первый параметр показывает, для какого класса мы пишем нашу карту сообщений, а второй - кто должен обрабатывать то или иное сообщение, если наш класс не может.

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

Третий шаг. В классе пишем метод для обработки конкретного сообщения. Для стандартных сообщений имена методов стандартны. Образуются они так: пишем новый префикс On, после которого пишем нужное сообщение Windows без префикса WM_, причем в нем прописными буквами пишем только первые буквы в каждом слове. Например, сообщение WM_ONLBUTTONDOWN превратится в OnLButtonDown. Параметры и возвращаемое значение берём из подсказок. Перед названием метода не забудем написать afx_msg. В нашем примере это

afx_msg void OnLButtonDown(UINT, CPoint);

Четвёртый шаг. В карту сообщений пишем макрос для нашего сообщения. В нашем примере это строка ON_WM_LBUTTONDOWN()

BEGIN_MESSAGE_MAP(CMyMainWnd, CFrameWnd)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

Его имя - это ON_ плюс имя сообщения.

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

void CMyMainWnd::OnLButtonDown(UINT, CPoint){
    AfxMessageBox("Левая кнопка мыши");
}

Функции с префиксом Afx определены в MFC глобально. Они не принадлежат конкретному классу.