Предыдущая Следующая
Базовый класс twindow отвечает на сообщения Windows через
СВОЮ фуНКЦИЮ-ЧЛен handle_message. В Листинге В.2.1 Пред-
ставлен код этой функции. Функции, такие как respond_wm_j>aint, задают ответ на определенное сообщение Windows, в данном случае wm_paint. В twindow этот ответ не является функциональным. Однако в производных классах окна необходимо лишь переопределить отдельные функции ответа на сообщение. Во многих случаях нет необходимости
Переопределять Саму фуНКЦИЮ handle_message. Заметим, ЧТО
во многих случаях handie_message возвращает 0. Возвращение 0 в операционную систему Windows заставляет ее продолжить обработку сообщения, а ненулевое значение прекращает обработку сообщения. Обычно лучше всего позволить Windows продолжить обработку сообщения после того, как вы сами его обработали, поскольку может существовать функциональность, о которой вы не знаете (часть которой может быть введена в более поздних версиях Windows).
Как Сообщения попадают В функцию handle_message?
В Windows с каждым типом окна связана процедур3 (процедура обратного вызова). Это связывание возникает путем назначения адреса процедуры окну при его регистрации. Регистрация ОКНа ПРОИСХОДИТ В фунКЦИИ WinMain«
В идеальном случае нам хотелось бы назначить адрес функции-члена handle_message. Однако С++ Не ПОЗВОЛЯеТ назНа-
чать адреса функций-членов, так как этот адрес не известен до тех пор, пока определенный объект (экземпляр) класса не будет создан во время выполнения. Вот почему twindow име-
ложение В. Библиотека утилит Windows
269
ет функцию-член set_giobai^ptr. В производных классах окна эта функция-член переопределяется так, чтобы установить глобальный указатель на определенный экземпляр класса окна (с помощью указателя класса this). Этот глобальный указатель затем определяет конкретный экземпляр функции
handle_message, КОТОраЯ ВЫЗЫвавТСЯ ИЗ ГЛобаЛЬНОЙ функции,
чей адрес предоставляется Windows в качестве процедуры обратного вызова, связанной с этим типом окна.
стингВ.2.1. Функция-член handle_message класса twindow
LRESULT CALLBACK twindow::handle_message (HWND hwnd, UINT message, WPARAM wParam, LP ARAM lParam) { /* If "respond_..." procedure actually does Предыдущая Следующая
|