Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Tab Control на чистом API


Автор: Max Damage 9.6.2003, 09:52
Как реализовать TabControl на чистом API, без MFC?

Автор: man2002ua 9.6.2003, 10:30
Создаешь окно с именем класса SysTabControl32.
А как работать с ним - смотри макросы TabCtrl_xxxxxxxxx они и в хелпе есть.

Автор: Max Damage 10.6.2003, 09:19
2man2002ua
А можно каким-то образом в апишный таб-контрол подпихнуть созданные конструктором диалоги?

Автор: man2002ua 10.6.2003, 14:11
Попробуй CreateDialog, в качестве hWndParent указать Handle созданного TabControl

Автор: Max Damage 7.7.2003, 16:35
Еще есть идеи у кого-то насчет подпихивания в табконтрол диалогов?

Автор: RAN 8.7.2003, 08:01
Max Damage, открой хелп. Диалоги в TabControl - это обычная практика и "другие идеи" не нужны. Или твой случай какой-то особенный? Тогда опиши поподробней.

У меня сделано так:
При создании TabControl создаются диалоги и окна, между которыми будет переключение, без WS_VISIBLE. В переменную HWND ActiveWindow; заноситься хэндл первого диалога (он же делается видимым). И просто обрабатывается переключение табов (ActiveWindow скрываем, через switch по номеры таба в ActiveWindow заносим новый хендл, делаем его видимым).

Автор: Max Damage 8.7.2003, 09:11
2RAN
Ничего особенного, просто я полное ламо в этом вопросе а хелп в 7-ой студии - ацтой, экзампл кода приведи пжалста.

Автор: RAN 8.7.2003, 20:47
в WM_CREATE:
Код

   RECT rc;
   GetClientRect(hwnd, &rc);
   HWND TCHandle = CreateWindow(WC_TABCONTROL, "", WS_CHILD | WS_VISIBLE,
              0, 0, rc.right, rc.bottom, hwnd, NULL, hInst, NULL);
   TC_ITEM tie;
   tie.mask = TCIF_TEXT | TCIF_IMAGE;
   tie.iImage = -1;

   static char* title[] = {
       "Заголовок1",
       "Заголовок2",
       "Заголовок3",
       NULL };
   register unsigned i = 0;
   while( (tie.pszText = title[i]) != NULL )
       TabCtrl_InsertItem(TCHandle, i++, &tie);

   //Создаём диалоги и окна
   HWND InfoDlg = CreateDialog(hInst, "INFO_DLG", TCHandle, InfoDlgProc);
   HWND SizeDlg = CreateDialog(hInst, "SIZE_DLG", TCHandle, SizeDlgProc);
   HWND DescWnd = CreateWindow("DESCWND", "Test", WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT, TCHandle, NULL, hInst, NULL);
   
   //Получим область для отображения окна
   TabCtrl_AdjustRect(TCHandle, FALSE, &rc);
   ActiveWnd = InfoDlg;
   SetWindowPos( ActiveHWnd, NULL, rc.left, rc.top, rc.right, rc.bottom, SWP_NOZORDER);


В WM_NOTIFY TCN_SELCHANGE:
Код

   register int page = TabCtrl_GetCurSel(TCHandle);
   GetWindowRect(TCHandle, &rc);
   TabCtrl_AdjustRect(TCHandle, FALSE, &rc);
   
   ShowWindow(ActiveHWnd, SW_HIDE);  //Прячем текущее окно

   //Определяем новое окно и показываем его
   switch(n){
       case 0:
           ActiveHWnd= InfoDlg;
           break;
       case 1:
           ActiveHWnd= SizeDlg;
           break;
       case 2:
           ActiveHWnd= DescWnd;
           break;
       }
   SetWindowPos(ActiveHWnd, NULL, rc.left, rc.top, rc.right, rc.bottom, SWP_NOZORDER);
   ShowWindow(ActiveHWnd, SW_SHOW);


P.S. Это так, для примера. ВОЗМОЖНЫ ОШИБКИ, прошу прощения. Просто у меня, каждое окно - это класс, а здесь я всё лишнее вырезал, возможно не совсем корректно.

Автор: Max Damage 9.7.2003, 09:31
2RAN
Сэнкс, попробую.

Автор: Max Damage 10.7.2003, 16:14
2RAN
А TCN_SELCHANGE в WM_NOTIFY это lParam или wParam?

Автор: RAN 10.7.2003, 16:38
WM_NOTIFY
idCtrl = (int) wParam; //В нашем случае совершенно бесполезная инфа. (В диалоге это ID элемента управления, пославшего WM_NOTIFY)
pnmh = (LPNMHDR) lParam; //Вот в этой структуре всё и содержится

typedef struct tagNMHDR {
HWND hwndFrom; //Handle TabContrl'а
UINT idFrom; //тоже, что и idCtrl
UINT code; //здесь код сообщения
} NMHDR;

Код

case WM_NOTIFY:
   if( ((LPNMHDR) lParam)->code == TCN_SELCHANGE)
          ....................................

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)