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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2011, 10:32   #1
Oct14
 
Регистрация: 12.03.2011
Сообщений: 8
По умолчанию Как привязать данные к HWND ?

Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT m, WPARAM wP, LPARAM lP);

class MyControl
{
protected:
   HWND   MainWnd;
   DWORD Data;
public:
   BOOL Create(/.../)
   {
       WNDCLASSEX wc;
       /.../
       wc.lpfnWndProc =WndProc;

       RegisterClassEx(&wc);

       MainWnd =CreateWindow(/.../);

       Data =1;
   }
};

LRESULT CALLBACK WndProc(HWND hwnd, UINT m, WPARAM wP, LPARAM lP)
{
    switch(m)
    {
      /..../
    }
    return DefWindowProc(hwnd,m,wP,lP);
}
Все это реализовано в Dll.

У всех экземпляров этого класс будет один и тотже обработчик сообщений окна (WndProc). Кагда Windows посылает сообщение моему окну, обработчику сообщения известен только хэндл окна (HWND), код сообщения и данные (WPARAM, LPARAM). Этот обработчик (WndProc) ничего не знает о переменной Data. В результате: WndProc не знает какую MyControl::Data использовать.

Как мне привязать данные к HWND, чтобы WndProc использовал Data именно того экземпляра класса с которым связан HWND. Также необходимо чтобы пользователи этой dll не смогли палучить доступ к этим данным.

Последний раз редактировалось Stilet; 12.03.2011 в 11:33.
Oct14 вне форума Ответить с цитированием
Старый 12.03.2011, 10:37   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

используйте список/массив/ассоциативный массив(точнее реализации)
состоящий из двух элементов(в случае ассоц массива первое ключ, второе значение):
HWND hwnd - хендл.
MyControl* ctr - объект контрола.
и далее просто проводите поиск в нем.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.03.2011, 10:41   #3
Oct14
 
Регистрация: 12.03.2011
Сообщений: 8
По умолчанию

Этот вариант не подходит, также как и вариант с SetWindowLong.
Oct14 вне форума Ответить с цитированием
Старый 12.03.2011, 10:43   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

почему не подходит?
именно этот вариант полностью удовлетворяет вашим условиям.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.03.2011, 10:44   #5
Oct14
 
Регистрация: 12.03.2011
Сообщений: 8
По умолчанию

Как Microsoft реализовала подобное для своих контролов (ComboBox, ListView, и т.д.) ?

я уже рассмотрел вариант с поиском, он работает, но мне нужна альтернатива

Последний раз редактировалось Stilet; 12.03.2011 в 11:33.
Oct14 вне форума Ответить с цитированием
Старый 12.03.2011, 10:49   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

скорее всего SetWindowLong с использованием при регистрации класса поля cbWndExtra;
кстати этот вариант скорее быстрее.

ЗЫ:оконный класс BUTTON не обязан являться классов ООП, там можно использовать процедурное программирование, а все данные контрола хранить в пространстве выделенном cbWndExtra;

добавил: третьего варианта я не знаю, хотя и занимался глубоко в этой сфере.

еще добавил: хотя есть третий, но совершенно не совместим с вашим кодом.(я его описал в ЗЫ, после запятой)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.03.2011 в 10:54.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.03.2011, 11:35   #7
Oct14
 
Регистрация: 12.03.2011
Сообщений: 8
По умолчанию

Благодарю.

Если третьего варианта нет - буду использовать SetWindowLong.
Oct14 вне форума Ответить с цитированием
Старый 12.03.2011, 17:27   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

GWL_USERDATA?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вывести hwnd? GrindeX C++ Builder 2 25.11.2010 01:33
Как найти путь к документу зная hWnd Maladoj Общие вопросы .NET 1 12.06.2009 20:26
как привязать время? Alexi Компоненты Delphi 2 12.04.2009 22:32
Как привязать help файл к программе? Волк Общие вопросы Delphi 1 13.02.2009 07:13
Как привязать рисунок к записи в БД? DIBAZOL БД в Delphi 12 17.07.2008 10:29