|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.09.2009, 05:52 | #1 |
Пользователь
Регистрация: 27.07.2009
Сообщений: 27
|
Важный вопрос насчет окон Windows
я зарегестрировал свой класс окна. При создании самого окна в сообщении WM_CREATE я могу создать какие либо данные, соответственно (например с помощью оператора new). Оператор new вернет указатель.
Суть вопроса: как мне привязать этот указатель к окну без хранения этого указателя в глобальной переменной. Также чтобы при создании еще одного такогоже окна создавалить данные для этого окна. И соответсвенно при уничтожении любого из этих окон уничтожались данные только уничтожаемого окна. P.S. Чтобы было понятнее что я подразумеваю - При создании стандартных окон в Windows (например SysListView) возвращается только хендл окна. Создать их можно сколько угодно и у всех будут свои данные: ImageList, списки и т.д. |
14.09.2009, 08:39 | #2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Как вариант: SetWindowLong с параметром GWL_USER или GWL_USERDATA. Я не помню просто уже чем они отличаются
|
14.09.2009, 08:59 | #3 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Ну вот попробуй поступи так - сделай класс окна, в котором будет скажем некий динмассив указателей. Далее при "добавлении" обьекта на окно, вписывай его в массив этот. А в конце проходи по массиву и освобождай приписанное в нем. Как правило это делается в обертках из классов.
I'm learning to live...
|
14.09.2009, 09:12 | #4 |
Пользователь
Регистрация: 27.07.2009
Сообщений: 27
|
Хранить в динмассиве можно, но нужен другой способ. Попробую USERDATA, но проблема в том что юзер сможет получить доступ к этим данным, а мне этого не хочется.
|
14.09.2009, 09:25 | #5 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
I'm learning to live...
|
||
14.09.2009, 15:54 | #6 |
Пользователь
Регистрация: 27.07.2009
Сообщений: 27
|
Если я что-то передам через SetWindowLong, я смогу это получить через GetWindowLong.
Массив неустраивает из-за постоянной проверки. Если например 100 окон, постоянно проверять массив при кажном обращении. Я намерен использовать эти данные в таких сообщениях как: WM_MOUSEMOVE, WM_PAINT, и т.д. А теперь представь если я провожу мышко по окну слева на право, окну посылается около 200 сообщений - 200 * 100 = 20000, и еще добавь сообщения прорисовки - смело на 100 умножаем, конечно можно подумать и сделать это все быстрее. Так что это крайний способ который я буду использовать. Мне бы как в стандартых окнах, например окно класса "LISTBOX" где-то же хранит свой список (у каждого окна свой). И при этом хранить можно только хендл окна, а данные получать и назначать через сообщения. Надеюсь теперь меня поняли. |
14.09.2009, 16:22 | #7 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
14.09.2009, 16:46 | #8 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Ну тот же ListBox должен хранить массив строк, TreeView - иерархию элементов и т.д. Только мне что-то тоже никак в голову не прийдет как это дело лучше всего хранить...
|
14.09.2009, 16:55 | #9 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
14.09.2009, 17:06 | #10 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Цитата:
В общем я бы сделал примерно так: Создал класс окна, где всё что надо реализовал. Добавил к этому классу статическую функцию типа WinProc для обработки сообщений. Код:
Я вижу тут 3 вариант: 1. SetWindowLong. Проблема - опасность вмешивания пользователя. Кто знает чего туда передадут 2. Можно попробовать использовать функцию SetProp. Опасность та же, что и в пункте 1, но шансы на порчу данных меньше. 3. Завести, например, std::map<HWND, MyControl*>. В минусах может быть скорость, но еще не факт. Кто знает как в самой винде это дело хранится. Зато никто ничего не запортит так просто и не вмешается в процесс. На небольших количествах контролов этого класса, оптимальнее будет массив. так что тут кому что нравится Больше, по крайней мере у меня, никаких идей нет |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вопрос по поводу Windows Vista | ROD | Безопасность, Шифрование | 1 | 19.08.2009 18:16 |
Вопрос по Windows Forms | tavrocotaps | Общие вопросы .NET | 0 | 11.06.2009 16:43 |
Вопрос насчет курсоров и печати изображения | Romich | Общие вопросы Delphi | 10 | 11.06.2009 02:05 |
Вопрос по windows media player. | multik | Софт | 0 | 02.11.2008 13:03 |
Насчет формы!!! | KlErik | Общие вопросы Delphi | 4 | 26.05.2007 10:59 |