- •Программирование для Windows
- •Литература
- •Вам необходимо знать и уметь
- •Первая программа
- •Соглашения операционной системы Windows
- •Вызовы функций Windows
- •Идентификаторы, написанные прописными буквами
- •Новые типы данных
- •Описатели
- •Венгерская нотация
- •Точка входа программы
- •Оконная процедура
- •Регистрация класса окна
- •Создание окна
- •Отображение окна
- •Цикл обработки сообщений
- •Оконная процедура
- •Обработка сообщений
- •Воспроизведение звукового файла
- •Сообщение wm_paint
- •Сообщение wm_destroy
- •Сложности программирования для Windows
- •Синхронные и асинхронные сообщения
- •Думайте о пользователе
- •Лекция3. Приступаем с изучению компонент
- •Урок 4. Класс tObjectи его потомки
- •Урок 5. Работа с кнопками
- •Урок 6. Компонент ActionList
- •Урок 7. Работаем с меню (класс tMainMenu)
- •Урок 8. Работаем с контекстным меню (класс tPopupMenu)
- •Урок 9. Компонент Edit
- •Урок 10. Работаем с двумя формами
- •Урок 11. Текст (компоненты tLabel и tStaticText)
- •Урок 12. Компонент ListBox
- •Урок 13. Компонент ComboBox
- •Урок 14. Используем api-функции
- •Урок 15. Разные MessageBox'ы
- •Урок 16. Компонент CheckBox
- •Урок 17. Компонент RadioButton
- •Урок 18. Класс tStrings
- •Урок 19. Класс tStringList
- •Урок 20. Работаем с сетью. Клиент (класс tClientSocket)
- •Урок 21. Работаем с сетью. Сервер (класс tServerSocket)
- •Урок 22. Компонент ImageList
- •Урок 23. Пересчитываем компоненты на форме
- •Урок 24. Форма - добавление методов
- •Урок 25. Форма - добавление полей
- •Урок 27. Значок на панели задач (компонент tTrayIcon)
- •Урок 28. Работаем со сплиттером
- •Урок 29. Компонент Panel
- •Урок 30. Совместное использование сплиттера и Panel'ей
- •Урок 31. Компонент HotKey
- •Урок 32. Компонент StatusBar
- •Урок 33. Установка главной формы приложения
- •Урок 34. Рисование на форме
Оконная процедура
Обо всем, о чем так долго говорилось, можно кратко сказать так: класс окна зарегистрирован, окно создано, окно выведено на экран, и для извлечения сообщений из очереди сообщений программа вошла в цикл обработки сообщений.
Реальная работа начинается в оконной процедуре, которую программисты обычно называют "window proc". Оконная процедура определяет то, что выводится в рабочую область окна и то, как окну реагировать на пользовательский ввод.
В программе HELLOWIN оконной процедурой является функция WndProc. Оконной процедуре можно назначить любое имя (любое, конечно, в той степени, в которой оно не будет конфликтовать с другими именами). В программе для Windows может содержаться более одной оконной процедуры. Оконная процедура всегда связана с определенным классом окна, который вы регистрируете, вызываяRegisterClassEx. ФункцияCreateWindowсоздает окно на основе определенного класса окна. На основе одного и того же класса можно создать несколько окон.
Оконная процедура всегда определяется следующим образом:
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
Отметьте, что четыре параметра оконной процедуры идентичны первым четырем полям структуры MSG.
Первым параметром является hwnd, описатель получающего сообщение окна. Это тот же описатель, который возвращает функцияCreateWindow. Для программы типа HELLOWIN, в которой создается только одно окно, имеется только один известный программе описатель окна. Если же в программе создается несколько окон на основе одного и того же класса окна (и следовательно одной и той же оконной процедуры), тогдаhwndидентифицирует конкретное окно, которое получает сообщение.
Вторым параметром является число (точнее 32-разрядное беззнаковое целое или UINT), которое идентифицирует сообщение. Два последних параметра (wParamтипа WPARAM иlParamLPARAM) представляют дополнительную информацию о сообщении. Они называются "параметрами сообщения" (message parameters). Конкретное значение этих параметров определяется типом сообщения.
Обработка сообщений
Каждое получаемое окном сообщение идентифицируется номером, который содержится в параметре iMsgоконной процедуры. В заголовочных файлах Windows определены идентификаторы, начинающиеся с префикса WM ("window message") для каждого типа сообщений.
Обычно программисты для Windows используют конструкции switchиcaseдля определения того, какое сообщение получила оконная процедура и то, как его обрабатывать. Если оконная процедура обрабатывает сообщение, то ее возвращаемым значением должен быть 0. Все сообщения, не обрабатываемые оконной процедурой, должны передаваться функции Windows, которая называетсяDefWindowProc. Значение, возвращаемое функциейDefWindowProc, должно быть возвращаемым значением оконной процедуры.
В HELLOWIN функция WndProcобрабатывает только три сообщения: WM_CREATE, WM_PAINT и WM_DESTROY. Оконная процедура выглядит следующим образом:
switch (iMsg)
{
case WM_CREATE:
[process WM_CREATE message]
return 0;
case WM_PAINT:
[process WM_PAINT message]
return 0;
case WM_DESTROY:
[process WM_DESTROY message]
return 0;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam);
Здесь важно отметить то, что вызов функции DefWindowProcобрабатывает по умолчанию все сообщения, которые не обрабатывает ваша оконная процедура.