Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Привязка CALLBACK функции к оконному классу. 
:(
    Опции темы
SeregaLBN
Дата 23.10.2003, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Есть класс наследуемый от CWnd:

class CMyWnd : public CWnd
{
...
}

Для некоторых экземпляров класса мне нужно привязать CALLBACK функцию, например hook функцию обработки мыши:

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode < 0)
return CallNextHookEx(CTerminalView::hHookMouse, nCode, wParam, lParam);

// моя обработка...

return CallNextHookEx(CTerminalView::hHookMouse, nCode, wParam, lParam);
}

Сначала я разместил эту ф-цию внутри класса CMyWnd. Но при установке хука
void CMyWnd::DoDataExchange(CDataExchange* pDX)
{
//...
hHookMouse = SetWindowsHookEx(WH_MOUSE, this->MouseProc, NULL, ::GetCurrentThreadId());
}
возникает error C2664: 'SetWindowsHookEx': cannot convert parameter 2 from 'long (int,unsigned int,long)' to 'long (__stdcall *)(int,unsigned int,long)'
Т.е., насколько я понимаю, макрос CALLBACK (когда ф-ция определена внутри класса) игнорируется.
Поэтому мне пришлось вынести CALLBACK функцию из описания класса.
И здесь возникает другая проблема - экземпляров класса много, а CALLBACK функция одна. Т.е. я не могу определить из CALLBACK функции к какому экземпляру класса она привязана.

Вопрос:
1. Можно ли как то определить CALLBACK ф-цию внутри класса, и вызывать её без ошибки?
2. Ели первое нельзя, то как можно определить из CALLBACK функции c каким экземпляром класса она связана?

PM MAIL   Вверх
RAN
Дата 23.10.2003, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Решение этой проблемы я приводил уже несколько раз (не меньше трёх).
последнее обсуждение
Постарайся разобраться. Не поймёшь идеи - спрашивай.
PM MAIL ICQ   Вверх
SeregaLBN
Дата 24.10.2003, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Спасибо за ответ.

В твоём примере указатель на экземпляр привязывается к конкретному окну с помощью CreateWindowEx(). Я также выполняю аналогично, но с помощью SetWindowLong(hWnd, GWL_USERDATA, (LONG)this), и выбирал экземпляр класса след. образом - CMyWnd* MyWnd = (CMyWnd*)GetWindowLong(hwnd, GWL_USERDATA).

С этим проблем нет.

Но как быть, если CALLBACK функция является, например, не hook функцией обработки мыши (где можно выбрать HWND из ((MOUSEHOOKSTRUCT*)lParam)->hwnd) и не CALLBACK функцией обработки сообшений окна (как в твоём примере), а hook функцией обработки клавиатуры (где нельзя выбрать HWND)?
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);
PM MAIL   Вверх
Ars
Дата 24.10.2003, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: 2
Всего: 2



Найди окно, которое имеет фокус ввода (см. ф-ции GetFocus, GetForegroundWindow)


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
SeregaLBN
Дата 24.10.2003, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Ты предлагаешь уникальное решение для ф-ции LRESULT CALLBACK KeyboardProc(...)
Скорее всего оно мне сейчас и поможет. Спасибо.
Но хотелось бы, на будущее, получить универсальное решение для всех CALLBACK ф-ций.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0796 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.