Страница 1 из 1

TabControl не переключаются страницы

Добавлено: 14 май 2004, 13:30
Irina
Создаю массив шаблонов в памяти и массив страниц функцией
CreateDialogIndirect
В диалоговой процедуре пытаюсь вкл/выкл страницы ShowWindow(..)
TabCtrl_GetCurSel возвращает номер страницы, но на экране остается страница выведенная в WM_INITDIALOG Может кто подскажет что-нибудь

Добавлено: 14 май 2004, 13:45
Romeo
Слишком мало информации. Причин может быть много. Если честно, то закладочки я делал один раз на MFC и неоднократно на ATL. На чистом API не доводилось ни разу, но, думаю, всё равно смогу помочь, если информации будет несколько больше...

Добавлено: 14 май 2004, 14:17
Irina
Создаю массив шаблонов в памяти и массив страниц функцией
CreateDialogIndirect
HWND DialogTab::CreateTabWindow(HWND hWnd){
...
hTab=CreateWindow(WC_TABCONTROL,"",WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE|WS_TABSTOP,...
...
Создаю массив шаблонов
DlgTab = new DialogTemplate[TAB_PAGES];
for(i = 0; i < NumTabs; i++)
{
DlgTab.InitDialogTemplate(_T(""), WS_CHILD|WS_VISIBLE, RTabD.left, RTabD.top, RTabD.right, RTabD.bottom, _T("Tahoma"),8);
DlgTab.AddButton(PagesArr, WS_VISIBLE|WS_CHILD, 0, 10+i*2, 10, 45 , 20, IDOK);
if (i == 0)
DlgTab.AddButton(PagesArr, WS_VISIBLE, 0, 15, 82, 66, 33, IDOK);
}
Сами страницы
for(i = 0; i < NumTabs; i++)
{
Tabs=CreateDialogIndirect(g_hInst, (DLGTEMPLATE*)DlgTab.dialogTemplate,hTab, NULL/*(DLGPROC)DlgProc*/);
GetClientRect(hMWnd,&RectTab);
MoveWindow(hTab,0,0,RectTab.right,RectTab.bottom, TRUE);
TabCtrl_AdjustRect(hTab,FALSE,&RectTab);
MoveWindow(Tabs,RectTab.left,RectTab.top,
RectTab.right - RectTab.left,RectTab.bottom-RectTab.top, TRUE);
}
} // End HWND DialogTab::CreateTabWindow(HWND hWnd)

В диалоговой процедуре пытаюсь вкл/выкл страницы ShowWindow(..)

static HWND hTab;
NMHDR *nmhdr;

case WM_INITDIALOG:
hTab = Tab.CreateTabWindow(hWnd);
i = TabCtrl_SetCurSel(hTab, 1);
Tab.ActivateTabPage(1);
return TRUE;
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code)
{
case TCN_SELCHANGE:
tab_selected = TabCtrl_GetCurSel(hTab);
Tab.ActivateTabPage(tab_selected);
return TRUE;
}

void DialogTab::ActivateTabPage(int p_NumPageToActivate)
{
for (int i = 0; i < NumTabs; i++)
{
ShowWindow(Tabs, ((i == p_NumPageToActivate) ? SW_SHOW : SW_HIDE));
}
}

Добавлено: 14 май 2004, 15:34
Hawk
На API есть такой удобный контрол (или просто наворот какой-то, контролом его сложно назвать) PropertySheet & PropertyPage. Я раншье тоже мучался с табами, пока не увидел, что можно без проблем сделать табовых диаложек, примерно таким образом -

Код: Выделить всё

    PROPSHEETPAGE psp[2];
    psp[0].dwSize = sizeof(psp[0]);
    psp[0].dwFlags = PSP_DEFAULT;
    psp[0].hInstance = g_hInst;
    psp[0].pszTemplate = MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1);
    psp[0].pfnDlgProc = (DLGPROC)&ToolsOptionsDialog1;

    psp[1].dwSize = sizeof(psp[1]);
    psp[1].dwFlags = PSP_DEFAULT;
    psp[1].hInstance = g_hInst;
    psp[1].pszTemplate = MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_2);
    psp[1].pfnDlgProc = (DLGPROC)&ToolsOptionsDialog2;

    PROPSHEETHEADER psh;
    psh.dwSize = sizeof(psh);
    psh.dwFlags = PSH_DEFAULT | PSH_PROPSHEETPAGE | PSH_MAXIMIZE | PSH_NOAPPLYNOW| PSH_USECALLBACK;
    psh.hwndParent = hWnd;
    psh.hInstance = g_hInst;
    psh.pszCaption = _T("Tools / Options");
    psh.nPages = 2;
    psh.nStartPage = 0;
    psh.ppsp = &psp[0];
    psh.pfnCallback = PropSheetCallback;
    PropertySheet(&psh);

Добавлено: 14 май 2004, 15:53
Hawk
А в твоем примере можно попробовать сделать ещё и UpdateWindow для каждого ShowWindow. И проверь в дебагере заходит ли туда вообще ?

Добавлено: 14 май 2004, 16:08
Irina
А в твоем примере можно попробовать сделать ещё и UpdateWindow для каждого ShowWindow. И проверь в дебагере заходит ли туда вообще ?
UpdateWindow не помогает, а
case TCN_SELCHANGE:
tab_selected = TabCtrl_GetCurSel(hTab);
отрабатывает правильно и HWND для страниц не меняются...

Добавлено: 14 май 2004, 16:54
Hawk
Может код пришлешь ?
hawkalk@inbox.ru

Добавлено: 14 май 2004, 19:03
Romeo
Через PropertySheet сделать намного проще. Не мучайся с TabControl'ом.

Добавлено: 17 май 2004, 14:05
Hawk
Romeo писал(а):Через PropertySheet сделать намного проще. Не мучайся с TabControl'ом.
Это понятно, но надо же понять почему не работает

Добавлено: 20 май 2004, 12:04
Irina
Благодарю всех за помощь. !!
Получилось как всегда...
TabControl (функция его создания) вызывалась два раза:
в WinMain и в обработчике WM_INITDIALOG. Теперь все работает...