![]() |
Как правильно "запихнуть" оконную процедуру в самодельный класс?
Как правильно "запихнуть" оконную процедуру в самодельный класс, и как потом правильно прикрутить ту процедуру к нужному окну(в данном случае-к кнопке)? Вот собственно код класса, прошу строго не судить, мой первый класс в жизни:)(который без оконной процедуры работает нормально):
Код:
class PNG_Button |
Цитата:
Код:
static LRESULT CALLBACK ButtonSubclassProc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) Цитата:
Код:
PNG_Button() |
ganselo, если делать статической, то пропадает доступ к членам класа. Можно подробнее про френд класа? Я вроде бы читал, что френдом класа может быть только другой клас...
|
Вот простенький пример:
Код:
class test |
ganselo, хм, интересно. Но так не пойдет, потому что функция-френд будет оконной процедурой, для которой добавить еще один аргумент для передачи указателя на наш клас не есть возможным. Надо как то запихнуть процедуру непосредствено в клас...
|
передача указателя решается несколькими путями:
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, указатель_на_класс теперь у оконной процедуры вместо HWND будет указатель_на_класс. Этот способ используется во многих библиотеках. Недостаток: для правильной работы требуется правильно расположить в памяти. Например если эти 32 байта взять внутри my_class, оно может не работать (у меня не стало, а то же самое, во вновь выделенной памяти - на ура) |
Время: 09:43. |
Время: 09:43.
© OSzone.net 2001-