![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
TarasBer |
![]()
Сообщение
#1
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Мне понадобилось, чтобы каждое окно помнило какую-нибудь дополнительную информацию.
Вариант с хеш-таблицей по описателю, мне кажется, не совсем архитектурен, ну как бы это объяснить, типа окно в винде, а таблица и информация - в программе. Вот например, любое окно где-то хранит свои координаты, у него есть какой-то свой личный блок памяти, и этот блок как бы на уровне винды, извиняюсь за такую терминологию. И у каждого класса блок памяти разный по размеру и структуре. Ну и мне кажется целесообразным, чтобы эта дополнительная информация хранилась в этом же блоке памяти. В общем как задавать размер этого блока при создании класса окна, как с ним работать? -------------------- |
![]() ![]() |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Что ж нечестного? Все как раз нормально, если ты наследуешься от того, что уже само унаследовано - будь добр в структуре, которую выделяешь в памяти и ссылку на которую оставляешь в USERDATA, предусмотреть поле Parent, которое будет хранить ссылку на данные, выделенные предком. То есть, в инициализаторе (конструкторе) потомка выделяешь память под нужный объем данных + Parent, в Parent считываешь текущее значение GWL_USERDATA, и потом пишешь новый указатель в GWL_USERDATA. Освобождать память - в обратном порядке...
Могу дать ссылку по работе с выделяемой памятью (увеличение cbWndExtra), но это делают только на Бейсике почему-то, ни на Дельфи ни на С++ я такого не встречал. А в том, как оно работает на Бейсике - честно говоря не совсем разобрался. Может у тебя получится? Вот: Take control of your window(s) [SUPERCLASS] |
![]() ![]() |
![]() |
Текстовая версия | 24.06.2025 15:29 |