Страница 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. Теперь все работает...