Сабклассинг

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

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

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

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

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

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

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

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

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

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

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

См. также

Примечания

  1. Обратите внимание на то, что оконный класс НЕ является классом в смысле ООП
  2. Message методы, или обработка сообщений классами

Ссылки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.