Сабклассинг

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Сабклассинг — процесс переопределения оконной процедуры[англ.], которую Windows назначает по умолчанию.

Назначение технологии

[править | править код]

Данная технология применяется в том случае, если требуется наделить окно какой-либо специфической реакцией на сообщение Windows. При помощи сабклассинга можно организовывать контроль ввода, блокировку закрытия окна. В целом самым важным здесь является, то что при необходимости программист получает полный контроль над поведением окна.

Преимущества сабклассинга

[править | править код]

В Windows есть довольно богатый выбор элементов управления, однако вы можете столкнуться c ситуацией, когда нужно дополнить поведение элемента управления. И здесь есть затруднение: процедуру, которую Windows назначает элементу управления изменить саму по себе невозможно. Есть два пути:

  • Написать элемент управления заново;
  • Воспользоваться возможностью переопределения оконной процедуры у данного элемента управления, что и является сабклассингом.

Недостатки первого подхода в том, что фактически программист вынужден заново «изобретать велосипед». Преимущество же сабклассинга в том, что он позволяет программисту сосредоточиться только на действительно нужных ему Windows-сообщениях, а остальные передать стандартной оконной процедуре.

Механизм работы сабклассинга

[править | править код]

Принцип работы его довольно прост: при создании окна Windows записывает в поле lpfnWndProc оконного класса WNDCLASSEX адрес процедуры-обработчика[1]. Windows предоставляет программисту функцию SetWindowLong, которая может изменять различные поля класса, в том числе и адрес процедуры обработки. При этом стандартная оконная процедура никуда не исчезает, её адрес содержится в поле defwindowproc, и если наша оконная процедура получает оконное сообщение, которое для своей обработки вмешательства программиста не требует, то наша оконная процедура передает его в стандартную оконную процедуру.

Ограничения сабклассинга

[править | править код]

Проблемы при использовании данной технологии возникнут в том случае, если программируется приложение с использованием VCL, OWL или MFC. Это связано с порядком обработки оконных сообщений Windows в данных библиотеках[2] .

Примечания

[править | править код]
  1. Обратите внимание на то, что оконный класс НЕ является классом в смысле ООП
  2. Message методы, или обработка сообщений классами. Дата обращения: 27 июля 2010. Архивировано 15 декабря 2010 года.