![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| SeregaLBN |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 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 каким экземпляром класса она связана? |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Решение этой проблемы я приводил уже несколько раз (не меньше трёх).
последнее обсуждение Постарайся разобраться. Не поймёшь идеи - спрашивай. |
|||
|
||||
| SeregaLBN |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 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 ); |
|||
|
||||
| Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: 2 Всего: 2 |
Найди окно, которое имеет фокус ввода (см. ф-ции GetFocus, GetForegroundWindow)
-------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
| SeregaLBN |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 3.10.2003 Где: Киев Репутация: нет Всего: нет |
Ты предлагаешь уникальное решение для ф-ции LRESULT CALLBACK KeyboardProc(...)
Скорее всего оно мне сейчас и поможет. Спасибо. Но хотелось бы, на будущее, получить универсальное решение для всех CALLBACK ф-ций. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |