Суперклассификация оконной процедуры
Суперклассификация (superclassing)
- методика, которая позволяет прикладной программе создавать новый класс окна с основными функциональными возможностями существующего класса, плюс расширение предоставляемых возможностей приложению. Суперкласс основан на существующем классе окна, называемым базовым классом (base class). Часто, базовый класс - это системный глобальный класс окна типа полей редактирования, но им может быть любой класс окна.Суперкласс имеет свою собственную оконную процедуру, называемую процедурой суперкласса.
Процедура суперкласса (superclass procedure) после приема сообщения может предпринять три действия: она может передать сообщение первоначальной оконной процедуре, изменить сообщение и передать его первоначальной оконной процедуре, или обработать сообщение и не передавать его первоначальной оконной процедуре. Если процедура суперкласса обрабатывает сообщение, она может поступать таким образом до того, после того, или и до того и после того, как передаст сообщение первоначальной оконной процедуре.В отличие от процедуры подкласса, процедура суперкласса может обрабатывать сообщения создания окна (
WM_NCCREATE, WM_CREATE и так далее), но она должна также передать их и первоначальной оконной процедуре базового класса так, чтобы эта оконная процедура могла исполнить свою процедуру инициализации.Чтобы сделать суперклассификацию класса окна, прикладная программа сначала вызывает функцию
GetClassInfo, чтобы извлечь информацию о базовом классе. GetClassInfo заполняет структуру WNDCLASS значениями из структуры WNDCLASS базового класса. Затем, приложение копирует свой собственный дескриптор экземпляра в член hInstance структуры WNDCLASS и копирует имя суперкласса в член lpszClassName. Если базовый класс имеет меню, прикладная программа должна предоставить новое меню с теми же самыми идентификаторами и скопировать имя меню в член lpszMenuName. Если процедура суперкласса обрабатывает сообщение WM_COMMAND и не передает его оконной процедуре базового класса, требуется иметь соответствующие идентификаторы меню. GetClassInfo не возвращает значения членов lpszMenuName, lpszClassName или hInstance структуры WNDCLASS.Прикладная программа, кроме того, должна установить член
lpfnWndProc структуры WNDCLASS. Функция GetClassInfo заполняет этот элемент адресом первоначальной оконной процедуры для класса. Приложение должно сохранить этот адрес, чтобы передавать сообщения первоначальной оконной процедуре, а затем скопировать адрес процедуры суперкласса в член lpfnWndProc. Прикладная программа может, в случае необходимости, изменять любые другие члены структуры WNDCLASS. После того, как программа заполнит структуру WNDCLASS, она регистрирует суперкласс, передавая адрес структуры в функцию RegisterClass. Суперкласс затем может быть использован, чтобы создавать окна.Поскольку суперклассификация регистрирует новый класс окна, прикладная программа может добавлять и дополнительные байты класса, и дополнительные байты окна. Суперкласс не должен использовать первоначальные дополнительные байты для базового класса или окна по тем же самым причинам, по которым и экземплярный и глобальный подкласс не должен использовать их. К тому же, если приложение добавляет дополнительные байты для своего использования или к классу или экземпляру окна, оно должно давать ссылку на дополнительные байты относительно числа дополнительных байтов, используемых первоначальным базовым классом. Поскольку число байтов, используемых базовым классом, может изменяться от одной версии базового класса к другой, начальное смещение для собственных дополнительных байтов суперкласса может также изменяться от одной версии базового класса к другой.