Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
Logot
1 / 1 / 0
Регистрация: 15.05.2010
Сообщений: 54
#1

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

30.08.2011, 21:14. Просмотров 3104. Ответов 1
Метки нет (Все метки)

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

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? - C++
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа? - C++
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое хэндлер файла? Что такое файловый указатель? - C++
Что такое хэндлер файла? Что такое файловый указатель?

Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них - C++
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них пожалуйста.

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере - C++
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их несколько). Можно ли, как-то, использовать...

Что такое перегрузка оператора? Что у меня в коде за ошибка? - C++
Что же я написал?? Что оно не компилится? Что значит error C2275: Superclass: недопустимое использование этого типа в качестве выражения ...

1
John Paramol
31.08.2011, 13:21 #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 возвращает адрес старой процедуры.

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

Глобальное субклассирование имеет все те ограничения,
к
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2011, 13:21
Привет! Вот еще темы с ответами:

В этой части кода происходит объявление функций? Что такое void? Что в скобках? - C++
В этой части кода происходит объявление функций? Что такое void? Что в скобках? void get(float **mas, int N, int M); void...

Что такое #, include, что это означает - C++
______

Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы - C++
Заранее спасибо.

Код не работает,говорит,что не знает,что такое delay(100).в чём проблема?как сделать,чтоб программа заработала? - C++
#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> int main() { int...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru