Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TABCONTROL и SetWindowLong - не работает, в чем дело? 
V
    Опции темы
Avenger2k
Дата 27.1.2007, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.5.2006

Репутация: нет
Всего: нет



Создаю новый проект Win32.

Меняю функцию BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) на свою:
Код

 HWND hwndTab; 
 TCITEM tie; 
 int i; 

InitCommonControls();
 try{
   hwndTab = CreateWindow(WC_TABCONTROL, TEXT("GeneralTab"),WS_VISIBLE, 
     0, 0, 500, 500, NULL, NULL, hInstance, NULL); 
   if(hwndTab==NULL){
MessageBox(NULL, TEXT("ERROR"), TEXT("ERROR"), MB_OK);
   }
 }catch(...){
   GetLastError();
 }
 if (hwndTab == NULL) 
   return NULL; 

 char g_achTemp[]="Some text";
 tie.mask = TCIF_TEXT | TCIF_IMAGE; 
 tie.iImage = -1; 
 tie.pszText = (LPWSTR)g_achTemp; 
 
 for (i = 0; i < 7; i++) { 
   LoadString(hInst, 1 + i, 
     (LPWSTR)g_achTemp, sizeof(g_achTemp)/sizeof(g_achTemp[0])); 
   if (TabCtrl_InsertItem(hwndTab, i, &tie) == -1) { 
     DestroyWindow(hwndTab); 
     return NULL; 
   } 
 } 

    SetWindowLong(hwndTab, GWL_WNDPROC, (LONG) WndProc);

 return true; 



Компилим, запускаем - пустое окно, табов нет.

убираем строчку    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) все напрочь ломается ?

Заранее спасибо
PM ICQ   Вверх
Avenger2k
Дата 28.1.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.5.2006

Репутация: нет
Всего: нет



Господа, неужели никто с таким не сталкивался? Или TABCONTROL'ы никого не интересуют?  smile 
PM ICQ   Вверх
Aleksandor
Дата 28.1.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



Наверно потому что возвращаться надо в процедуру табконтролов, а не главного окна.
То есть надо писать отдельную процедуру субклассинга для табконтролов, и любых других тоже ))


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Avenger2k
Дата 30.1.2007, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.5.2006

Репутация: нет
Всего: нет



Thx, бум копать глубже  smile 
PM ICQ   Вверх
sgi1981
Дата 30.1.2007, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: нет
Всего: 10



Потому что функция  SetWindowLong возвращает в вашем случае адрес на предыдущую оконную функцию TABCONTROL-а и в собственной оконной функции необходимо ее вызывать тоже.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Earnest
Дата 31.1.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Именно, вместо DefWindowProc нужно возвращать старую функцию, которую ты подменил.


--------------------
...
PM   Вверх
Avenger2k
Дата 1.2.2007, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.5.2006

Репутация: нет
Всего: нет



Спасибо за ответы. Буду дальше ковырять. Что-то уже, кажется, вырисовывается...  smile 
PM ICQ   Вверх
Avenger2k
Дата 3.2.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.5.2006

Репутация: нет
Всего: нет



Доброго времени суток. Огромное спасибо всем, кто откликнулся. 
С субклассингом вроде как разобрался, но некоторые вопросы остались.

Итак, сделал некоторые изменения. В частности вместо DefWindowProc вызываю CallWindowProc и т.д.

В итоге компилирую приложение, запускаю - табов опять нет.
Закомментировал обработку WM_PAINT - табы рисуются.

Отсюда несколько вопросов:
1) Мне придется теперь руками их рисовать, если мне надо обрабатывать событие WM_PAINT? Вставка CallWindowProc в WM_PAINT не прокатила  smile 

2) Если я прорисую все прямоугольнички вручную как их привязать к TABCONTROL, чтобы работало переключение между ними и т.д.? В общем чтобы они обрабатывались как TABCONTROL?

Цель всей этой заморочки - пишу плагин к экрану Today под Windows Mobile 5.0 и надо, чтобы на экране табы были прозрачными. Без обработки WM_PAINT рисуется прозрачный прямоугольник, но сами вкладки (где имя и значек) прорисовываются с белым фоном. Надо убрать прямоугольник и вкладки сделать прозрачными.

В общем вот так все это выглядит непотребно:
user posted image


Regards

P.S. Только не надо перемещать тему в форум "Программирование мобильных устройств", т.к. вопросы непосредственно по WinAPI  smile 

Это сообщение отредактировал(а) Avenger2k - 3.2.2007, 21:06
PM ICQ   Вверх
Earnest
Дата 6.2.2007, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Либо ты сам рисуешь (обрабатываешь WM_PAINT), либо стандартная процедура. Если хочешь изменить прорисовку табов, используй стиль OwnerDraw. Еще есть CustomDraw, но я не помню, действует ли оно по отношению к TabControl.  CustomDraw удобнее, т.к. ты можешь использовать стандартное рисование, изменив только то, что нужно. Однако OwnerDraw гибче. И в том, и в другом случае прямоугольник для рисования тебе дадут. Про custom Draw смотри в MSDN NM_CUSTOMDRAW.


--------------------
...
PM   Вверх
Avenger2k
Дата 11.2.2007, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.5.2006

Репутация: нет
Всего: нет



Thx, кажется начинает получаться
Думаю тему можно закрывать
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1370 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.