Вкладки

Тема в разделе "WASM.WIN32", создана пользователем Euler, 15 июл 2010.

  1. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Тут столкнулся с небольшой проблемой связанной со вкладками- вкладки долго переключаются. Не так, чтобы очень долго, но я успеваю увидеть "мигание" экрана. Вкладки реализованы через диалоги:
    Код (Text):
    1. Dialog0 DIALOG 0,0,0,0
    2. FONT 8,"MS Sans Serif"
    3. STYLE WS_CHILD|WS_POPUP|DS_3DLOOK|DS_CONTEXTHELP
    4. {
    5.     CONTROL "",0,"Static",WS_CHILD|WS_VISIBLE|SS_CENTERIMAGE|SS_CENTER,0,0,75,25
    6. }
    Переключение диалогов происходит через функцию:
    Код (Text):
    1. void ShowTab(int n)
    2. {
    3.     //...
    4.     /*BorderSize- толщина рамки
    5.     TitleSize- размер заголовка окна
    6.     TabWidth- толщина контрола со вкладками(SysTabControl32)
    7.     n- вкладка на которую надо переключить
    8.     CurrentTab- текущая вкладка
    9.     g_hWnd- HWND главного окна
    10.     g_hDlg- массив с HWND заголовков*/
    11.     GetClientRect(g_hWnd,&ClientRect);
    12.     GetWindowRect(g_hWnd,&WindowRect);
    13.     MoveWindow(g_hDlg[n],WindowRect.left+BorderSize,WindowRect.top+TitleSize+TabWidth,ClientRect.right,ClientRect.bottom-20,FALSE);
    14.     ShowWindow(g_hDlg[n],SW_SHOW);
    15.     if(CurrentTab!=-1)
    16.         ShowWindow(g_hDlg[CurrentTab],SW_HIDE);
    17.     CurrentTab=n;
    18.     return;
    19. }
    Причём замер скорости этой функции через GetTickCount стабильно даёт 0 мс. Подскажите пожалуйста, в чём может быть дело?
     
  2. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
    Попробуйте у родительского окна стиль WS_CLIPCHILDREN а у вкладок WS_CLIPSIBLINGS
     
  3. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Не помогло. Сейчас у родительского окна стили
    Код (Text):
    1. WS_CAPTION|WS_SYSMENU|WS_VISIBLE|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SIZEBOX
    а у контрола
    Код (Text):
    1. WS_CHILD|WS_VISIBLE|WS_TABSTOP
     
  4. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
    Euler
    Можно целиком проект посмотреть?
     
  5. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Конечно.
     
  6. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
    Код (Text):
    1.                 nTab=TabCtrl_GetCurSel(lpNMHdr->hwndFrom);
    2.                 ShowTab(nTab);
    ...
    Код (Text):
    1.     if(n==nTab)
    2.     {
    3.         WCHAR temp[10];
    4.         TC_ITEM Item={TCIF_TEXT,NULL,NULL,temp,4,NULL,NULL};
    5.         _itow(nTab,temp,10);
    6.         g_hDlg[nTab]=CreateDialogParam(g_hInst,L"Dialog0",hTab,DialogProc,nTab);
    7.         SendMessage(hTab,TCM_INSERTITEM,nTab,(LPARAM)&Item);
    8.         SendMessage(hTab,TCM_SETCURSEL,nTab,0);
    9.         nTab++;
    10.     }
    Условие всегда будет истинным, т.е. при клике на любой вкладке у Вас всегда будет создаваться ещё одно окно. Возможно дело в этом.
     
  7. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Большое спасибо за помощь, но к сожалению не то :dntknw: . n- это номер вкладки по которой тыкнули, а nTab- это номер последней вкладки(крайняя справа, на ней изображён плюсик). Т.е. этот кусок кода сработает только если тыкнуть по самой правой вкладке и сделает следующее:
    Код (Text):
    1. WCHAR temp[10];
    2. TC_ITEM Item={TCIF_TEXT,NULL,NULL,temp,4,NULL,NULL};
    3. _itow(nTab,temp,10);
    4. g_hDlg[nTab]=CreateDialogParam(g_hInst,L"Dialog0",hTab,DialogProc,nTab);//создаём диалог
    5. SendMessage(hTab,TCM_INSERTITEM,nTab,(LPARAM)&Item);//добавляем вкладку
    6. SendMessage(hTab,TCM_SETCURSEL,nTab,0);//делаем эту вкладку активной
    7. nTab++;//номер "вкладки с плюсиком" увеличился на единицу
     
  8. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
    Да, не обратил внимания, что nTab существует как локальная переменная.
     
  9. Bazhan

    Bazhan Андрей

    Публикаций:
    0
    Регистрация:
    8 янв 2008
    Сообщения:
    71
    Адрес:
    Украина
    Euler
    скачай neatpad18.zip отсюда http://www.catch22.net/tuts/neatpad/18
    Options.c функция void ShowOptions(HWND hwndParent)
     
  10. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    ндээ любитель отладки (скачал сорс тоже посмотреть) назвать глобальную переменную nTab и заводить еще локальную с таким же именем (это ахтунг полный) я бы глобальную как минимум обозвал nTabXXXXXXXXXXX чем длиннее и осмысленнее тем лучше
    вчера только баг из за этого словил удаляю переменную с текущей области видимости а прога компилируется собирается (только не работает) где то в внешней области видимости (вложенных выше блоков) такая же переменная с таким же именем (но у меня э
    то не специально получилось) вот и отлаживай тут можно только пожелать счастливой отладки :)
     
  11. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Bazhan, там используется Propery Sheet- это совсем другой контрол.
    "ндээ любитель рассказывать истории", естественно я случайно переменные одинаково обозвал(обычно глобальные имеют префикс g_).
     
  12. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    подписывать g_ к глобальным переменным тоже считаю мракобесием но это только моё имхо :)