Перехват сообщений

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Перехват сообщений

Сообщение Alexanbar » 23.03.2005 (Ср) 22:57

Делаю я класс-модуль.
В нём помещаю такое дело:


mWndProcNext = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)


Оператор Addressof не разрешает, чтобы процедура находилась в том же класс-модуле - только в обычном модуле, а меня такой вариант категорически не устаивает, поскольку в windowProc нельзя передать дополнительные параметры, если она будет вне класс-модуля.

В связи с чем возник вопрос, можно ли поместить WindowProc в класс-модуль, и при этом использовать другое средство, кроме AddressOf?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.03.2005 (Чт) 5:29

В Кирпичах есть Сабклассер :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.03.2005 (Чт) 8:11

Alexanbar, вообще-то WindowProc должен быть строго определенного вида, никаких фантазий (с пользовательскими типами) не допускается.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.03.2005 (Чт) 10:38

Я так понял, что имелся в виду доступ процедуры сабклассинга к локальным переменным экземпляра класса. Тады сабклассер помогает.
Иначе нет :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 24.03.2005 (Чт) 21:39

Вот только бы ещё разобраться, как этот SubClasser прикрутить.
Уточняю задачу. Есть форма (фрейм, Picturebox), на которой есть Listview (или два, три ... Listview).
Необходимо отловить сообщение, посылаемое от Listview к своему контейнеру.
В WindowProc для контейнера (форма, фрейм, Picturebox)отлавливается сообщение WM_Notify. При этом нужно определить, от кого оно, т.е. получить ссылку на объект Listview. А далее - дело техники.

Сделал я всё это в стандартном проекте, где до всего есть доступ.
А хотелось бы сделать класс, в котором есть всего 1-2 метода:


Private Listview1 as listview
private mWndNext as long

Public Property Let Listview(Lvw as object)
Set listview1=lvw
'далее mWndNext=SetWindowLong(...)
end sub


public sub UnSubClass

'Восстанавливаем WindowProc
end sub


А далее включаем его в ActiveXDll и используем на всех формах, где есть Listview.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 24.03.2005 (Чт) 23:32

Ну, вроде, основную идею понял. Нужно в модуле создать коллекцию Листвьёв или чего-то, содержащее ссылку на них, беря в качестве ключа их hwnd. Далее в WindowProc искать в коллекции по ключу , от какого Листвья (или не Листвья, если данный ключ отсутствует в коллекции) пришло сообщение

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 26.03.2005 (Сб) 0:49

Ну всё. одолел сие безобразие. Заодно извлёк некоторые положительные моменты из такого подхода.
Не понятно, почему разрабочики VB6 не разрешили AddressOf для ф-и в класс-модуле? Чего им, жалко что ли?

Вспомнил фильм детский, кажется из Ералаша. Отличник занимается с двоечником, и объясняет, что такое параллельные прямые. Наконец, двоечник говорит, что он понял, что параллельные прямые не пересекаются, не понял, почему они не пересекаются.

Вот у меня так.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.03.2005 (Сб) 15:37

Alexanbar писал(а):Не понятно, почему разрабочики VB6 не разрешили AddressOf для ф-и в класс-модуле? Чего им, жалко что ли?

Нет, просто смысла в этом немного :)
Ведь каждая процедура-член класса имеет дополнительный неявный первый параметр - указатель на интерфейс себя любимой. Именно так функции различают, для какого экземпляра класса вызвана функция - ведь код один на все экземпляры.
Так что даже будь этот адрес, его нельзя было бы передать винде. Потому что она ничего не знает о том, что первый параметр должен быть As Object - да и знала бы, где она его возьмёт? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 70

    TopList