Форум программистов, компьютерный форум CyberForum.ru

Что такое Сабклассирование?(SubclassWindow) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
Logot
1 / 1 / 0
Регистрация: 15.05.2010
Сообщений: 54
30.08.2011, 21:14     Что такое Сабклассирование?(SubclassWindow) #1
Насколько я понимаю, сабкласирование - это заимствование обработчиков сообщений другого объекта, причём базовый класс у них один и тот же. Почему нельзя сабкласировать больше 1 объекта?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2011, 21:14     Что такое Сабклассирование?(SubclassWindow)
Посмотрите здесь:

Что такое 15 - (15/4) *4 ? C++
C++ Код не работает,говорит,что не знает,что такое delay(100).в чём проблема?как сделать,чтоб программа заработала?
C++ что такое for(;;)
C++ Объясните человеческим языком мне чайнику что такое singleton, статический класс. Зачем они нужны. Что рекомендуете прочитать мне для начала
Что такое перегрузка оператора? Что у меня в коде за ошибка? C++
C++ Что такое С++ ?
В этой части кода происходит объявление функций? Что такое void? Что в скобках? C++
Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Paramol
Сообщений: n/a
31.08.2011, 13:21     Что такое Сабклассирование?(SubclassWindow) #2
Субклассирование (subclassing) - метод, позволяющий приложению
перехватывать и обрабатывать сообщения, посланные
некоторому окну прежде, чем оно сможет обработать его.
Путем субклассирования окна приложение может дополнять,
изменять или контролировать его поведение.
Хотя это и не рекомендуется, приложение может
субклассировать любое окно, в том числе, принадлежащее
системному классу, такое как Edit или ListBox.
Для примера, приложение может субклассировать
контрол Edit, чтобы не допускать ввода определенных символов.

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

Windows предоставляет два вида субклассирования:
отдельное (instance subclassing)
и глобальное (global subclassing).
При отдельном субклассировании приложение заменяет
оконую процедуру отдельно взятого окна.
Отдельное субклассирование используется для
уже существующих окон.
В глобальном субклассировании приложение заменяет
адрес оконной процедуры в структуре WNDCLASS класса окна.
Все созданные впоследствии окна этого класса имеют
переопределенный адрес оконной процедуры.
На уже существующие окна класса это не повлияет.

Приложение субклассирует экземпляр окна исполюзуя
функцию SetWindowLong с флагом GWL_WNDPROC. Новая
процедура может находиться либо в самом програмном
модуле, либо в DLL. Имя новой процедуры следует
регистрировать в описании EXPORTS
в файле определения модуля (.DEF).

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

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

Когда приложение субклассирует субклассированное окно,
оно должно впоследствии удалять подклассы в обратном
порядке. В противном случае может произойти неисправимая
системная ошибка.

Для того чтобы глобально субклассировать оконный класс
приложение должно иметь дескриптор окна этого класса.
Дескриптор нужен также для удаления подкласса.
Обычно, чтобы получить дескриптор, приложение создает
невидимое окно этого класса. Получив дескриптор,
приложене вызывает SetClassLong с флагом GCL_WNDPROC,
дескриптором окна и адресом новой оконной процедуры.
SetClassLong возвращает адрес старой процедуры.

Адрес изначальной оконной процедуры используется
также, как при отдельном субклассировании.
Приложение, глобально субклассирующее класс контрола
должно при завершении удалить подкласс, иначе
может произойти неисправимая системная ошибка.

Глобальное субклассирование имеет все те ограничения,
к
Yandex
Объявления
31.08.2011, 13:21     Что такое Сабклассирование?(SubclassWindow)
Ответ Создать тему
Опции темы

Текущее время: 14:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru