Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2009, 05:52   #1
HWork
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 27
По умолчанию Важный вопрос насчет окон Windows

я зарегестрировал свой класс окна. При создании самого окна в сообщении WM_CREATE я могу создать какие либо данные, соответственно (например с помощью оператора new). Оператор new вернет указатель.
Суть вопроса: как мне привязать этот указатель к окну без хранения этого указателя в глобальной переменной. Также чтобы при создании еще одного такогоже окна создавалить данные для этого окна. И соответсвенно при уничтожении любого из этих окон уничтожались данные только уничтожаемого окна.

P.S. Чтобы было понятнее что я подразумеваю - При создании стандартных окон в Windows (например SysListView) возвращается только хендл окна. Создать их можно сколько угодно и у всех будут свои данные: ImageList, списки и т.д.
HWork вне форума Ответить с цитированием
Старый 14.09.2009, 08:39   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Как вариант: SetWindowLong с параметром GWL_USER или GWL_USERDATA. Я не помню просто уже чем они отличаются
pu4koff вне форума Ответить с цитированием
Старый 14.09.2009, 08:59   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вот попробуй поступи так - сделай класс окна, в котором будет скажем некий динмассив указателей. Далее при "добавлении" обьекта на окно, вписывай его в массив этот. А в конце проходи по массиву и освобождай приписанное в нем. Как правило это делается в обертках из классов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2009, 09:12   #4
HWork
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 27
По умолчанию

Хранить в динмассиве можно, но нужен другой способ. Попробую USERDATA, но проблема в том что юзер сможет получить доступ к этим данным, а мне этого не хочется.
HWork вне форума Ответить с цитированием
Старый 14.09.2009, 09:25   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
проблема в том что юзер сможет получить доступ к этим данным
Это еще с какого перепуга?
Цитата:
можно, но нужен другой способ.
Чем этот не угодил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2009, 15:54   #6
HWork
Пользователь
 
Регистрация: 27.07.2009
Сообщений: 27
По умолчанию

Если я что-то передам через SetWindowLong, я смогу это получить через GetWindowLong.
Массив неустраивает из-за постоянной проверки.
Если например 100 окон, постоянно проверять массив при кажном обращении. Я намерен использовать эти данные в таких сообщениях как: WM_MOUSEMOVE, WM_PAINT, и т.д. А теперь представь если я провожу мышко по окну слева на право, окну посылается около 200 сообщений - 200 * 100 = 20000, и еще добавь сообщения прорисовки - смело на 100 умножаем, конечно можно подумать и сделать это все быстрее. Так что это крайний способ который я буду использовать.

Мне бы как в стандартых окнах, например окно класса "LISTBOX" где-то же хранит свой список (у каждого окна свой). И при этом хранить можно только хендл окна, а данные получать и назначать через сообщения.

Надеюсь теперь меня поняли.
HWork вне форума Ответить с цитированием
Старый 14.09.2009, 16:22   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если я провожу мышко по окну слева на право, окну посылается около 200 сообщений
Ну и что? Я не пойму что за данные ты хочешь прикреплять к окну то?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2009, 16:46   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну и что? Я не пойму что за данные ты хочешь прикреплять к окну то?
Ну тот же ListBox должен хранить массив строк, TreeView - иерархию элементов и т.д. Только мне что-то тоже никак в голову не прийдет как это дело лучше всего хранить...
pu4koff вне форума Ответить с цитированием
Старый 14.09.2009, 16:55   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ну тот же ListBox должен хранить массив строк
Ну он так и делает, я одного не пойму с чего автор взял что массивы будут ему обузой?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2009, 17:06   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну он так и делает, я одного не пойму с чего автор взял что массивы будут ему обузой?
Ну если много контролов этого класса создавать, то поиск по массиву будет не самый шустрый. Опять же удалять контрол из начала/середины массива не есть хорошо.
В общем я бы сделал примерно так:
Создал класс окна, где всё что надо реализовал. Добавил к этому классу статическую функцию типа WinProc для обработки сообщений.
Код:
class MyControl
{
static LRESULT CALLBACK WinProc (...);
};

LRESULT CALLBACK MyControl::WinProc (...)
{
  switch (...)
  {
  case WM_CREATE:
    MyControl *new_control = new MyControl(...); // Создание нового объекта
    // Привязка объекта к хэндлу окна
    ...
    break;
  case WM_DESTROY:
    // Поиск соответствующего объекта по хэндлу окна
    ...
    delete obj; // Удаление объекта
    break;
  }
}
Остаётся проблема с сопоставлением: хендл <-> объект
Я вижу тут 3 вариант:
1. SetWindowLong. Проблема - опасность вмешивания пользователя. Кто знает чего туда передадут
2. Можно попробовать использовать функцию SetProp. Опасность та же, что и в пункте 1, но шансы на порчу данных меньше.
3. Завести, например, std::map<HWND, MyControl*>. В минусах может быть скорость, но еще не факт. Кто знает как в самой винде это дело хранится. Зато никто ничего не запортит так просто и не вмешается в процесс. На небольших количествах контролов этого класса, оптимальнее будет массив. так что тут кому что нравится
Больше, по крайней мере у меня, никаких идей нет
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по поводу 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