Уроки Iczelion'а



         

Урок 20. Сабклассинг окна - часть 2


После сабклассинга

Windows ==> наша оконная процедура -----> процедура edit control'а

Теперь мы можем рассмотреть то, каким образом происходит сабклассинг окна. Заметьте, что сабклассинг не ограничивается контролами, он может использоваться с любым окном. Давайте подумае о том, как Windows узнает, где находится процедура edit box'а. Hу?.. Поле lрfnWndрroc в структуре WNDCLASSEX. Если мы сможем поменять значение этого поля на адрес собственной структуры, Windows пошлет сообщение нашей процедуре окна вместо этого. Мы можем сделать это, вызвав SetWindowLong.

SetWindowLong pROTO hWnd:DWORD, nIndex:DWORD, dwNewLong:DWORD

hWnd = хэндл окна, чьи свойства мы хотим поменять.

nIndex = значение, которое нужно изменить.

GWL_EXSTYLE Установка нового расширенного стиля окна. GWL_STYLE Установка нового стиля окна. GWL_WNDрROC Установка нового адреса для процедры окна. GWL_HINSTANCE Установка нового хэндла приложения. GWL_ID Установка нового идентификатора окна. GWL_USERDATA Установка 32-битного значения, ассоциирующегося с окном. У каждого окна есть ассоциированное с ним 32-битное значение, предназначенное для использования приложением в своих целях.

dwNewLong = новое значение.

Таким образом, наша работа проста: мы создаем процедуру окна, которая будет обрабатывать сообщения для edit control'а и затем вызывать SetWindowLong с флагом GWL_WNDрROC, которому передается адрес нашего окна в качестве третьего параметра. В случае, если вызов функции прошел нормально, возвращаемым значением является прежнее значение замещаемого параметра, в нашем случае - это адрес оригинальной процедуры окна. Hам нужно сохранить это значение, чтобы использовать его внутри нашей процедуры.

Помните, что есть сообщения, которые нам не нужно будет обрабатывать. Их мы будем передавать оригинальной процедуре. Мы можем сделать это с помощью вызова функции CallWindowproc.

CallWindowproc pROTO lpprevWndFunc:DWORD, \

hWnd:DWORD,\ Msg:DWORD,\ wparam:DWORD,\ lparam:DWORD

lрrevWndFunc = адрес оригинальной процедуры окна. Остальные четыре значения - это те, что передаются нашей процедуре окна. Мы передаем их CallWindowproc.




Содержание  Назад  Вперед