Witam! Mam problem z dodaniem kontrolki tab box w mojej aplikacji (w resorces). Kiedy wybieram ją z toolboxa i przeciągam na okno dialogowe (które użytkownik wybiera z menu) od razu wyskakuje mi tab box z 5 zakładkami i nie mogę się przełączyć pomiędzy nimi. Nie mam pojęcia jak zrobić takie okno dialogowe z zakładkami. Na msdn przeczytałem, że trzeba wypełnić strukturę TCITEM i wywołać funkcję TabCtrl_InsertItem ale nic to nie daje (wyświetla mi się w dialogu "czysty" prostokąt). Jakieś sugestie?
To jest dość trudne do zrobienia.
W designerze tabów edytować się nie da, to tylko atrapa. Trzeba to zrobić w kodzie.
Zawartość poszczególnych tabów tworzysz w zasobach jako osobne dialogi, którym trzeba wyłączyć ramkę.
Potem na otwarciu okna dialogowego z tabcontrolem kolejno robisz tak:
-
dodajesz taby za pomocą tego
TabCtrl_InsertItem
-
ładujesz z zasobów dialogi które mają być na poszczególnych tabach. dialogi powinny mieć ten sam parent co tabcontrol (czyli nie tabcontrol, a dialog nadrzędny) —
FindResource
,LoadResource
,CreateDialogIndirect
-
na każdym dialogu robisz MoveWindow w miejsce tabcontrola (TabCtrl_AdjustRect się przyda do pobrania właściwego RECTa) —
GetClientRect
,TabCtrl_AdjustRect
,MapWindowRect
,MoveWindow
. -
jeśli masz w programie "common controls manifest" to na każdym dialogu-zakładce robisz
EnableThemeDialogTexture(htab, ETDT_ENABLETAB)
-
w zdarzeniu TCN_SELCHANGING tabcontrola ukrywasz bieżący dialog (SW_HIDE), a w TCN_SELCHANGE pokazujesz (SW_SHOW) —
TabCtrl_GetCurSel
,ShowWindow
.
Tak, mogliby tę kontrolkę jakoś bardziej zautomatyzować, tak jak zautomatyzowali tworzenie samych dialogów. Ale jakoś nie chcieli - powyższe wygląda na brzydki hack, ale tak to niestety działa. Podpowiem że można to opakować i ukryć brzydotę w nieco ponad 100 linijkach :-)