Сабклассинг
Эта страница требует существенной переработки. |
Эта статья нуждается в переработке. |
Сабклассинг — процесс переопределения оконной процедуры[англ.], которую Windows назначает по умолчанию.
Назначение технологии
[править | править код]Данная технология применяется в том случае, если требуется наделить окно какой-либо специфической реакцией на сообщение Windows. При помощи сабклассинга можно организовывать контроль ввода, блокировку закрытия окна. В целом самым важным здесь является, то что при необходимости программист получает полный контроль над поведением окна.
Преимущества сабклассинга
[править | править код]В Windows есть довольно богатый выбор элементов управления, однако вы можете столкнуться c ситуацией, когда нужно дополнить поведение элемента управления. И здесь есть затруднение: процедуру, которую Windows назначает элементу управления изменить саму по себе невозможно. Есть два пути:
- Написать элемент управления заново;
- Воспользоваться возможностью переопределения оконной процедуры у данного элемента управления, что и является сабклассингом.
Недостатки первого подхода в том, что фактически программист вынужден заново «изобретать велосипед». Преимущество же сабклассинга в том, что он позволяет программисту сосредоточиться только на действительно нужных ему Windows-сообщениях, а остальные передать стандартной оконной процедуре.
Механизм работы сабклассинга
[править | править код]Принцип работы его довольно прост: при создании окна Windows записывает в поле lpfnWndProc оконного класса WNDCLASSEX адрес процедуры-обработчика[1]. Windows предоставляет программисту функцию SetWindowLong, которая может изменять различные поля класса, в том числе и адрес процедуры обработки. При этом стандартная оконная процедура никуда не исчезает, её адрес содержится в поле defwindowproc, и если наша оконная процедура получает оконное сообщение, которое для своей обработки вмешательства программиста не требует, то наша оконная процедура передает его в стандартную оконную процедуру.
Ограничения сабклассинга
[править | править код]Проблемы при использовании данной технологии возникнут в том случае, если программируется приложение с использованием VCL, OWL или MFC. Это связано с порядком обработки оконных сообщений Windows в данных библиотеках[2] .
См. также
[править | править код]- Перехват (программирование)
- Событийно-ориентированное программирование
- Событие (объектно-ориентированное программирование)
Примечания
[править | править код]- ↑ Обратите внимание на то, что оконный класс НЕ является классом в смысле ООП
- ↑ Message методы, или обработка сообщений классами . Дата обращения: 27 июля 2010. Архивировано 15 декабря 2010 года.