При программировании в Windows очень важно понимать разницу между обычным программированием и событийным. Давайте посмотрим, что представляет из себя программирование скажем на C в ДОС все начинается с main, потом идет вызов ряда функций
main() { f1(); f2(); }
Эти функции в свою очередь вызывают другие и так далее. Для организации реакции на действия пользователя приходилось делать бесконечные циклы типа
while (TestKey());
При этом выполнение программы останавливалось. Был и другой подход основанный на обработке прерываний. Вот это и был подход основанный на событиях. Необходимо было перехватить прерывание и тогда при его появлении управление сразу передавалось на необходимую функцию не пробегая полностью по дереву вызовов. Правда количество прерываний было ограничено.
Итак, есть два способа создания программ. Первый в виде дерева вызовов, второй это реакции на события. Вы легко можете заметить разницу, попробуйте пройти по шагам программу для Windows на основе MFC и вы увидите, что в определенный момент она просто остановится, так как не знает куда дальше идти. При программировании в виде дерева этого бы не случилось, так как вы бы увидели четкие циклы ожидания на основе конкретных функций, а здесь этих функций нет. Нет функций типа scanf или getch, которые ждут ввода.
Можно наверно утверждать, что вызовы функций при программировании в DOS заменены сообщениями в Windows. Сообщения намного функциональнее, так как вы можете послать сообщение за пределы вашего кода, например, другой программе и используя сообщение вызвать в той программе необходимые действия не зная ни названия функции, ни метода реализации, ни каких-либо других параметров.
События и сообщения как они связаны ??? Каждое событие рождает сообщение. Сообщение это следствие события. Так кто может сгенирировать сообщения ???
Аппаратура Диспетчер окон Другие окна
Вообще сообщения описываются в виде констант начинающихся с WM_ описанных в файле winuser.h. Подобные константы введены для удобства. На самом деле сообщение, то есть информация о нем, передается в виде структуры MSG.
typedef struct tagMSG { HWND hwnd; // кому адресовано сообщение UINT message; // идентифкатор сообщения (WM_...) WPARAM wParam; // дополнительная информация LPARAM lParam; // дополнительная информация DWORD time; // значения системных часов POINT pt; // расположение курсора мыши } MSG;
Программирование в Windows является событийным, то есть нельзя построить дерево вызовов функций для приложения. Кроме того вызызвать сообщение и соответственно реакцию программы может и внешняя среда и другие программы.