TabControl не переключаются страницы
Модераторы: Duncon, Hawk, Romeo, Eugie
Создаю массив шаблонов в памяти и массив страниц функцией
CreateDialogIndirect
В диалоговой процедуре пытаюсь вкл/выкл страницы ShowWindow(..)
TabCtrl_GetCurSel возвращает номер страницы, но на экране остается страница выведенная в WM_INITDIALOG Может кто подскажет что-нибудь
CreateDialogIndirect
В диалоговой процедуре пытаюсь вкл/выкл страницы ShowWindow(..)
TabCtrl_GetCurSel возвращает номер страницы, но на экране остается страница выведенная в WM_INITDIALOG Может кто подскажет что-нибудь
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Слишком мало информации. Причин может быть много. Если честно, то закладочки я делал один раз на MFC и неоднократно на ATL. На чистом API не доводилось ни разу, но, думаю, всё равно смогу помочь, если информации будет несколько больше...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
HWND DialogTab::CreateTabWindow(HWND hWnd){Создаю массив шаблонов в памяти и массив страниц функцией
CreateDialogIndirect
...
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));
}
}
На 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);
А в твоем примере можно попробовать сделать ещё и UpdateWindow для каждого ShowWindow. И проверь в дебагере заходит ли туда вообще ?
UpdateWindow не помогает, аА в твоем примере можно попробовать сделать ещё и UpdateWindow для каждого ShowWindow. И проверь в дебагере заходит ли туда вообще ?
case TCN_SELCHANGE:
tab_selected = TabCtrl_GetCurSel(hTab);
отрабатывает правильно и HWND для страниц не меняются...
Может код пришлешь ?
hawkalk@inbox.ru
hawkalk@inbox.ru
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Через PropertySheet сделать намного проще. Не мучайся с TabControl'ом.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Это понятно, но надо же понять почему не работаетRomeo писал(а):Через PropertySheet сделать намного проще. Не мучайся с TabControl'ом.
Благодарю всех за помощь. !!
Получилось как всегда...
TabControl (функция его создания) вызывалась два раза:
в WinMain и в обработчике WM_INITDIALOG. Теперь все работает...
Получилось как всегда...
TabControl (функция его создания) вызывалась два раза:
в WinMain и в обработчике WM_INITDIALOG. Теперь все работает...