powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как делать сабклассинг внутри класса?
4 сообщений из 4, страница 1 из 1
А как делать сабклассинг внутри класса?
    #38437804
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот не подсказал мне с Listview никто, я таки решил сваять его на API, теперь мучаюсь - видимо надолго.
Ну заодно оформить как класс.
Наваял такую фигню:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private m_OldWindowProc as Long

Private Sub Subclass()
  m_OldWindowProc = SetWindowLong(m_hwndLV, GWL_WNDPROC, AddressOf NewWindowProc)
End Sub

Private Function NewWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Select Case Msg
    Case WM_MOVE
       RaiseEvent MouseMove(...)
    Case Else
  End Select
  
  NewWindowProc = CallWindowProc(m_OldWindowProc, hwnd, Msg, wParam, lParam)
End Function



Ну, светлая идея чего хочу надеюсь понятна.
Ругается на AddressOf, че дальше делать не знаю, делегатов тут нету.
...
Рейтинг: 0 / 0
А как делать сабклассинг внутри класса?
    #38437901
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddressOf работает только с функциями, объявленными в модулях. Использовать для сабклассинга функцию, объявленную в классе, можно только с помощью ассемблерных хаков. Здесь написали библиотеку, облегчающую эту задачу, и используют ее во всех своих поделках, но у меня она стабильно валилась на каком-то конкретном сообщении.

Впрочем, всего лишь для генерации события в контроле из оконной процедуры это не надо.
Я давал тебе свою библиотеку коммон контролов ucComCtl2 или 3? Вроде давал. Там это делается.
...
Рейтинг: 0 / 0
А как делать сабклассинг внутри класса?
    #38437945
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

давать то давал, только я ее тогда не осилил.
Да думаю проще свой написать с минимумом необходимого функционала, вроде уже продвинулся.

Я нашел чистый пример как сабклассинг в классе делается:
http://www.xtremevbtalk.com/showthread.php?t=228745
В подробности особо не влезал, но вроде все чисто работает.

Единственная проблема, этот код позволяет делать сабклассинг только на одно hwnd.
А надо минимум
1) сам Listview
2) Parent

MouseUp через ListView напр. глючит, надо делать через родителя.
Не помню что там с heder-ами, надо ли их сабклассить.

Короче я этот код тупо задвоил, сделал везде по 2 ф-ции
ISubclass_WndProc
ISubclass_WndProcParent
SubWnd
SubWndParent
и т.д.
вроде не глючит
...
Рейтинг: 0 / 0
А как делать сабклассинг внутри класса?
    #38438127
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Я нашел чистый пример как сабклассинг в классе делается:
http://www.xtremevbtalk.com/showthread.php?t=228745
В подробности особо не влезал, но вроде все чисто работает.Его аналог я и использовал.

Дмитрий77Единственная проблема, этот код позволяет делать сабклассинг только на одно hwnd.Проблема не в этом, а в "особо не влезал", хотя там влезать не во что, весь код на экран помещается. Этот способ способен сабклассить любое количество окон. У меня он сабклассит и ListView и его контейнер как тебе и нужно. Вся его суть — сохранить (SetProp) указатели на необходимые объекты (ObjPtr) и старую оконную процедуру в свойствах того окна, в процедуре которого нужно дергать объекты, и вытащить их в ней (GetProp).
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как делать сабклассинг внутри класса?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]