![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Avenger2k |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 23.5.2006 Репутация: нет Всего: нет |
Создаю новый проект Win32.
Меняю функцию BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) на свою:
Компилим, запускаем - пустое окно, табов нет. убираем строчку SetWindowLong(hwndTab, GWL_WNDPROC, (LONG) WndProc); Все шоколадно - табы на месте и их можно переключать. В WndProc все стандартно. Обрабатываются WM_COMMAND, WM_PAINT, WM_DESTROY. Ничего там не менялось - как VS2005 создает проект, так все и есть. По дефолту возвращается DefWindowProc(hWnd, message, wParam, lParam); Многоуважаемый ALL, в чем может быть дело? Почему, если вызывать SetWindowLong(hwndTab, GWL_WNDPROC, (LONG) WndProc) все напрочь ломается ? Заранее спасибо |
|||
|
||||
| Avenger2k |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 23.5.2006 Репутация: нет Всего: нет |
Господа, неужели никто с таким не сталкивался? Или TABCONTROL'ы никого не интересуют?
|
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
Наверно потому что возвращаться надо в процедуру табконтролов, а не главного окна.
То есть надо писать отдельную процедуру субклассинга для табконтролов, и любых других тоже )) -------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| Avenger2k |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 23.5.2006 Репутация: нет Всего: нет |
Thx, бум копать глубже
|
|||
|
||||
| sgi1981 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 16.3.2006 Репутация: нет Всего: 10 |
Потому что функция SetWindowLong возвращает в вашем случае адрес на предыдущую оконную функцию TABCONTROL-а и в собственной оконной функции необходимо ее вызывать тоже.
-------------------- Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Именно, вместо DefWindowProc нужно возвращать старую функцию, которую ты подменил.
-------------------- ... |
|||
|
||||
| Avenger2k |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 23.5.2006 Репутация: нет Всего: нет |
Спасибо за ответы. Буду дальше ковырять. Что-то уже, кажется, вырисовывается...
|
|||
|
||||
| Avenger2k |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 23.5.2006 Репутация: нет Всего: нет |
Доброго времени суток. Огромное спасибо всем, кто откликнулся.
С субклассингом вроде как разобрался, но некоторые вопросы остались. Итак, сделал некоторые изменения. В частности вместо DefWindowProc вызываю CallWindowProc и т.д. В итоге компилирую приложение, запускаю - табов опять нет. Закомментировал обработку WM_PAINT - табы рисуются. Отсюда несколько вопросов: 1) Мне придется теперь руками их рисовать, если мне надо обрабатывать событие WM_PAINT? Вставка CallWindowProc в WM_PAINT не прокатила 2) Если я прорисую все прямоугольнички вручную как их привязать к TABCONTROL, чтобы работало переключение между ними и т.д.? В общем чтобы они обрабатывались как TABCONTROL? Цель всей этой заморочки - пишу плагин к экрану Today под Windows Mobile 5.0 и надо, чтобы на экране табы были прозрачными. Без обработки WM_PAINT рисуется прозрачный прямоугольник, но сами вкладки (где имя и значек) прорисовываются с белым фоном. Надо убрать прямоугольник и вкладки сделать прозрачными. В общем вот так все это выглядит непотребно: ![]() Regards P.S. Только не надо перемещать тему в форум "Программирование мобильных устройств", т.к. вопросы непосредственно по WinAPI Это сообщение отредактировал(а) Avenger2k - 3.2.2007, 21:06 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Либо ты сам рисуешь (обрабатываешь WM_PAINT), либо стандартная процедура. Если хочешь изменить прорисовку табов, используй стиль OwnerDraw. Еще есть CustomDraw, но я не помню, действует ли оно по отношению к TabControl. CustomDraw удобнее, т.к. ты можешь использовать стандартное рисование, изменив только то, что нужно. Однако OwnerDraw гибче. И в том, и в другом случае прямоугольник для рисования тебе дадут. Про custom Draw смотри в MSDN NM_CUSTOMDRAW.
-------------------- ... |
|||
|
||||
| Avenger2k |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 23.5.2006 Репутация: нет Всего: нет |
Thx, кажется начинает получаться
Думаю тему можно закрывать |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |