Для внесения изменений в существующее окно следует использовать функции GetWindowLongPtrO и SetWindowLongPtrO с аналогичными параметрами. В качестве первого параметра указывается дескриптор окна, а второй параметр содержит константу, имя которой составлено из префикса и названия параметра функции CreateWindowEx(), например GWL_EXSTYLE или GWL_STYLE. Чтобы получить указатель на оконную процедуру, необходимо передать константу GWLP_WNDPROC. Для хранения такого указателя в Windows предусмотрен специальный тип WNDPR0C.

Подмена оконной процедуры функцией SetWindowLongPtrC) выполняется в тех случаях, когда необходимо модифицировать поведение уже существующего окна. Такая задача часто возникает при необходимости изменить поведение окон стандартных классов. Например, обычная кнопка передает в диалоговое окно сообщение о нажатии, когда пользователь отпускает клавишу мыши. Если программист моделирует работу микротелефонной гарнитуры, то ему потребуются сообщения по нажатии и отпускании кнопки клавишей мыши. В таких случаях не требуется полностью изменять функциональность стандартного класса, поэтому программист может действовать несколько иначе.

Графические элементы управления При помощи функции WNDPROC def - GetWindowLongPtr(hWnd, GWLP_WNDPROC) можно получить адрес существующей процедуры, а вызов функции SetWi ndowLongPtr () может подменить ее новой процедурой. В теле своей процедуры разработчик выполняет нестандартную обработку поступающих сообщений и вызывает старую, стандартную процедуру для тех сообщений, реакция на которые не должна изменяться. Ранее было продемонстрировано, что оконную процедуру можно вызывать как обычную функцию, но в API Windows для вызова процедуры, адрес которой получен при помощи GetWindowLongPtrO, предусмотрена специальная функция Cal 1 Wi ndowProcCWNDPROC. HWND. UINT, WPARAM. LPARAM). Кроме параметров, необходимых оконной процедуре, ей передается запомненный выше указатель WNDPROC def.

Последовательность операторов, которые в диалоговой функции окна hDl g выполняют модификацию поведения кнопки IDC_SEND, приведена в листинге 6.12. Указатель на стандартный обработчик запоминается в переменной Def, а вместо него кнопка будет использовать процедуру SendButton().


⇐ Предыдущая| |Следующая ⇒