Имя пользователя:
Пароль:
 

Показать сообщение отдельно
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


передача указателя решается несколькими путями:
1. через отображение HWND -> my_class* (самый защищённый)
где-то хранится массив пар HWND, my_class*; функция WindowProc ищет в этом массиве свой HWND и для найденного(ных) указателя(лей) выполняет какой-нить виртуальный my_class::__wndproc
2. установка SetWindowLong (ИМХО самый экономный)
для субклассинга лучше использовать GWL_USERDATA, хотя можно и зарегистировать новый класс на основании старого, только увеличить cbHwndExtra (или как его там), и хранить в нём нужную информацию
3. через свойства SetProps (ну тоже хороший способ)
главное угадать такое название свойства, которое ещё никто не придумал. Прикрутить к этому названию свой указатель. Я замерял производительность - после 4 способа - самый быстрый, название свойства брал reinterpret_cast<wchar_t*>(1).
4. через сгенерированную в памяти функцию (самый быстроработающий)
для каждого окна в памяти выделяется блок 32 байта, в который пишется машинный код
Код: Выделить весь код
mov eax, указатель_на_класс
mov[esp+4], eax
jmp WindowProc
nop
nop
nop
Окну в качестве процедуры выставляется адрес этих 32 байт
теперь у оконной процедуры вместо HWND будет указатель_на_класс. Этот способ используется во многих библиотеках. Недостаток: для правильной работы требуется правильно расположить в памяти. Например если эти 32 байта взять внутри my_class, оно может не работать (у меня не стало, а то же самое, во вновь выделенной памяти - на ура)
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:09, 23-02-2010 | #6