CTabCtrl - Tabs mit Dialogen - Probleme mit Showwindow
-
Hallo,
ich will in einer MFC-Dialog-Anwendung ein TabCtrl verwenden.
Ich habe mich etwas an diesem Forumsbeitrag orientiert: BeitragDamit alles Nachvollziehbar ist, fang ich ganz vorne an:
Ich habe bisher ein neues Projekt erstellt (MFC-Dialog) und 2 Dialoge angelegt.
(IDD_DIALOG1, IDD_DIALOG2)Nun habe ich im OnInitDialog() meines Hauptdialoges (CTestDlg dlg) folgendes eingefügt:
CTabCtrl* m_Tabs; m_Tabs = ( CTabCtrl* ) GetDlgItem( IDC_TAB1 ); CDialog* m_Dlg1 = ( CDialog* ) GetDlgItem( IDD_DIALOG1 ); CDialog* m_Dlg2 = ( CDialog* ) GetDlgItem( IDD_DIALOG2 ); TCITEM Tab1; Tab1.mask = TCIF_TEXT | TCIF_PARAM; Tab1.pszText = (LPTSTR)(LPCTSTR)"Overview"; Tab1.lParam = (LPARAM)m_Dlg1; TCITEM Tab2; Tab2.mask = TCIF_TEXT | TCIF_PARAM; Tab2.pszText = (LPTSTR)(LPCTSTR)"Statistic"; Tab2.lParam = (LPARAM)m_Dlg2; m_Tabs->InsertItem(0, &Tab1); m_Tabs->InsertItem(1, &Tab2); m_Dlg1->ShowWindow(SW_SHOW);Doch wenn ich das Kompiliere bekomme ich eine Access Violation in der zeile:
ASSERT(::IsWindow(m_hWnd)); //In der WINOCC.CPPMeines Erachtens nach dürfte dass passieren, da ich die Dialoge noch nicht Created habe, vor dem ShowWindow.
Also habe ich jetzt davor "m_Dlg1->Create(IDD_DIALOG1, GetParent());" gemacht.Allerdings bekomme ich dann eine Acces Violation in der Zeile:
m_lpszTemplateName = lpszTemplateName; //In DLGCORE.CPPKann mir erklären wie ich es hinbekomme, dass die Dialoge angezeigt werden können?
P.S.: Da ich annehme dass gleich wieder Leute kommen die sagen, dass ich CPropertySheet/CPropertyPage benutzen soll:
Nach dem was ich bisher von CPropertySheet verstanden habe, ist dies für mich nicht geeignet(Ich brauche Buttons und
Textfelder um mein TabCtrl herum), mal ganz abgesehen davon, dass ich das noch weniger verstehe wie den CTabCtrl.
-
slide schrieb:
Hallo,
ich will in einer MFC-Dialog-Anwendung ein TabCtrl verwenden.
Ich habe mich etwas an diesem Forumsbeitrag orientiert: BeitragDamit alles Nachvollziehbar ist, fang ich ganz vorne an:
Ich habe bisher ein neues Projekt erstellt (MFC-Dialog) und 2 Dialoge angelegt.
(IDD_DIALOG1, IDD_DIALOG2)Nun habe ich im OnInitDialog() meines Hauptdialoges (CTestDlg dlg) folgendes eingefügt:
CTabCtrl* m_Tabs; m_Tabs = ( CTabCtrl* ) GetDlgItem( IDC_TAB1 ); CDialog* m_Dlg1 = ( CDialog* ) GetDlgItem( IDD_DIALOG1 ); CDialog* m_Dlg2 = ( CDialog* ) GetDlgItem( IDD_DIALOG2 ); TCITEM Tab1; Tab1.mask = TCIF_TEXT | TCIF_PARAM; Tab1.pszText = (LPTSTR)(LPCTSTR)"Overview"; Tab1.lParam = (LPARAM)m_Dlg1; TCITEM Tab2; Tab2.mask = TCIF_TEXT | TCIF_PARAM; Tab2.pszText = (LPTSTR)(LPCTSTR)"Statistic"; Tab2.lParam = (LPARAM)m_Dlg2; m_Tabs->InsertItem(0, &Tab1); m_Tabs->InsertItem(1, &Tab2); m_Dlg1->ShowWindow(SW_SHOW);Doch wenn ich das Kompiliere bekomme ich eine Access Violation in der zeile:
ASSERT(::IsWindow(m_hWnd)); //In der WINOCC.CPPMeines Erachtens nach dürfte dass passieren, da ich die Dialoge noch nicht Created habe, vor dem ShowWindow.
Also habe ich jetzt davor "m_Dlg1->Create(IDD_DIALOG1, GetParent());" gemacht.Allerdings bekomme ich dann eine Acces Violation in der Zeile:
m_lpszTemplateName = lpszTemplateName; //In DLGCORE.CPPKann mir erklären wie ich es hinbekomme, dass die Dialoge angezeigt werden können?
Das geht so nicht, Du musst die Controls für die einzelnen Karteikarten des TabCtrls auf das Tabctrl legen und das ggfs. übereinander und beim Umschalten der Karteikarten halt die Ctrls einblennden, die zu dieser Karteikarte gehören undn die anderen alle ausblenden. Das ist ja mit einer der Gründe, warum immer von der Benutzung des TabCtrls abgeraten wird. Tipp: kopiere die Ctrls aus den beiden Dialogen auf das TabCtrl. Wenn Du Änderungen daran machen musst, löschst Du die Ctrls auf dem TabCtrl alle, änderst in den beiden Dialogen und kopierst anschliessend die Ctrls beider Dialoge wieder auf das TabCtrl.
P.S.: Da ich annehme dass gleich wieder Leute kommen die sagen, dass ich CPropertySheet/CPropertyPage benutzen soll:
Natürlich!! Ich gehöre auch zu den Verfechtern von CPropertySheet/Page 8-P!!
Nach dem was ich bisher von CPropertySheet verstanden habe, ist dies für mich nicht geeignet(Ich brauche Buttons und
Textfelder um mein TabCtrl herum), mal ganz abgesehen davon, dass ich das noch weniger verstehe wie den CTabCtrl.Das was Du machen willst, geht auch. Habe ich auch schon gemacht. Irgendwo hier im Forum habe ich die prinzipielle Vorgehensweise zum Einbetten eines CPropertySheets in einen Dialog mal beschrieben. Ist aber auch nachzulesen in "The MFC Answer Book" aus dem Addison-Wesley Verlag.
-
Devil81 hatte doch mal ne schöne Anleitung und h/cpp hier im Forum
gepostet.Gibt's Devil81 überhaupt noch? Ich nutze zumindest seine TabCtrl-Klasse
noch immer mit Erfolg
-
Ich möchte auch noch mal darauf hinweisen, dass es weitaus einfacher ist die fertigen CPropertySheet und CPropertyPage Klassen zu verwenden, asls sich alls mit einem Dialog und einem CTabCtrl zusammmen zu basteln.
-
Martin Richter schrieb:
Ich möchte auch noch mal darauf hinweisen, dass es weitaus einfacher ist die fertigen CPropertySheet und CPropertyPage Klassen zu verwenden, asls sich alls mit einem Dialog und einem CTabCtrl zusammmen zu basteln.
*g*

Hatten wir dazu nicht noch im Forum eine Anleitung wie das in einen Dialog
eingebttet wird? Hmm...finde aber auf die Schnelle in der Suche so auch nix...
Schade, wäre sicher interessant gewesen.
-
Es ist wahrscheinlich zu einfach

// CPage1 etc. werden wir Dialoge behandelt und angelegt. // Danach einfach die Basisklasse auf CProprtyPage ändern. class CPage1 : public CPropertyPage { ... }; class CPage2 : public CPropertyPage { ... }; ... CPage1 page1; CPage2 page2; ... CPrpertySheet sheet; sheet.AddPage(&page1); sheet.AddPage(&page2);Evtl. kann das der Wizard auch...
-
Martin deine Lösung erzeugt doch aber einen neuen Dialog der
als selbständiges Fenster erscheint, oder?Was er aber will ist die Einbettung in einen bestehenden Dialog soweit ich
das verstehe.Vielleicht hilft dann noch der Link:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-171485-and-highlight-is-ctabctrl.html
-
Lese ich nicht so:
MFC-Dialog-Anwendung ein TabCtrl verwenden.
-
Martin Richter schrieb:
Lese ich nicht so:
MFC-Dialog-Anwendung ein TabCtrl verwenden.
Sorry, das ich wage, Dir zu widersprechen
, aber:P.S.: Da ich annehme dass gleich wieder Leute kommen die sagen, dass ich CPropertySheet/CPropertyPage benutzen soll:
Nach dem was ich bisher von CPropertySheet verstanden habe, ist dies für mich nicht geeignet(Ich brauche Buttons und
Textfelder um mein TabCtrl herum), mal ganz abgesehen davon, dass ich das noch weniger verstehe wie den CTabCtrl.
-
Jencas und Dito haben recht. Ich möchte es in einen bestehenden Dialog einbinden, so dass ein paar Elemente (4 Buttons und ein textfeld) immer angezeigt werden. Egal auf welchem Tab man gerade ist.
So wie es Martin geschrieben hat, hört es sich recht leicht an. Aber wie binde ich den CPropertySheet in einen Dialog ein? Oder wird der einfach darübergelegt?
Muss man um den CPropertySheet zu sehen noch ein Objekt davon erstellen und ein ShowWindow oder so machen?
-
CPropertySheet muss mit DoModal aufegrufen werden. Es erzeugt einen eigenen Dialog. Du kannst Dir überlegen außerhalb des TabControls selbst noch andere Controls anzulegen. Schau Dir mal mit Dem Spy++ die Konstruktion an wenn Du CPropertySheet::DoModal aufgerufen hast.