ERLEDIGT
JA
JA
ANTWORTEN
2
2
ZUGRIFFE
964
964
EMPFEHLEN
-
Hallo,
ich habe ein Tab-Control mit 2 Tabs auf dem von CFormView abgeleiten View bei der Initialisierung erzeugt. Es wäre aber gut danach bei Bedarf noch zusätzliche Tabs per Knopfdruck einfügen zu können. Wie mache ich das?
Ich habe versucht die neuen Tabs genau so wie bei der Initialisierung einzufügen, aber ich habe es nur geschafft leere Tabs einzufügen. Wenn ich mit .create einen Dialog an den neuen Tab anbinden will, bekomme ich keine Fehler beim kompilieren, dafür aber eine Meldung „Debug Assertion Failed“ (siehe angehängtes Bild), wenn ich einen neuen Tab mit dem Inhalt einfügen will (drucke die Taste "Tab einfügen").
Fehler:
Wincore.cpp
Line 624
ASSERT(pWnd->m_hWnd==NULL) //only do once
Ich nehme an, dass .create nur bei Initialisierung gut ist, aber was für ein Befehl benutze ich stattdessen?
Nun zum Code, den ich dank eurem Forum zusammengestellt habe:
.cpp
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
////////////////////////////////////////////////////////////////////////////////////////////////// // Tabs bei Initialisierung void CTest_8View::OnInitialUpdate() { TCITEM TabItem; int iIndex; CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); // create the Tabs CString TabName = "Seite 1"; iIndex = 0; TabItem.mask = TCIF_TEXT | TCIF_PARAM; TabItem.lParam = (LPARAM)&m_PropPage1; TabItem.pszText = (LPTSTR)(LPCTSTR)TabName; m_TabCtrl.InsertItem(iIndex, &TabItem); m_TabCtrl.SetItem(iIndex, &TabItem); TabName = "Seite 2"; iIndex = 1; TabItem.mask = TCIF_TEXT | TCIF_PARAM; TabItem.lParam = (LPARAM)&m_PropPage2; TabItem.pszText = (LPTSTR)(LPCTSTR)TabName; m_TabCtrl.InsertItem(iIndex, &TabItem); m_TabCtrl.SetItem(iIndex, &TabItem); // create Dialogs m_PropPage1.Create(IDD_PROPPAGE_1, &m_TabCtrl); m_PropPage2.Create(IDD_PROPPAGE_2, &m_TabCtrl); // Dialog position CRect rcItem; m_TabCtrl.GetItemRect(0, &rcItem); m_PropPage1.SetWindowPos( NULL, rcItem.left, rcItem.bottom + 1, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); m_PropPage2.SetWindowPos( NULL, rcItem.left, rcItem.bottom + 1, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); // show the first dialog m_PropPage1.ShowWindow(SW_SHOW); m_PropPage2.ShowWindow(SW_HIDE); m_TabCtrl.SetCurSel(0); } void CTest_8View::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult) { TCITEM item; CWnd* pWnd; int iNewTab = m_TabCtrl.GetCurSel(); item.mask = TCIF_PARAM; // aktuellen Tab ausblenden m_TabCtrl.GetItem(m_uiSelectedTab, &item); if( item.lParam ) { pWnd = reinterpret_cast<CWnd*> (item.lParam); pWnd->ShowWindow(SW_HIDE); } // neuen Tab anzeigen m_TabCtrl.GetItem(iNewTab, &item); if(item.lParam) { pWnd = reinterpret_cast<CWnd*> (item.lParam); pWnd->ShowWindow(SW_SHOW); } *pResult = 0; } void CTest_8View::OnTcnSelchangingTab1(NMHDR *pNMHDR, LRESULT *pResult) { m_uiSelectedTab = m_TabCtrl.GetCurSel(); *pResult = 0; } ///////////////////////////////////////////////////////////////////////////////////////////////////// // Insert neue Tabs // Mit leeren Tabs scheint zu funktionieren static int TabIndex = 1; bool CTest_8View::NewTab() { TCITEM TabItem; TabIndex++; // create the Tabs CString s; s.Format(_T("Neuer Tab %d"), TabIndex+1); CString TabName = s; TabItem.mask = TCIF_TEXT; // | TCIF_PARAM; //TabItem.lParam = (LPARAM)&m_Dialog3; TabItem.pszText = (LPTSTR)(LPCTSTR)TabName; m_TabCtrl.InsertItem(TabIndex, &TabItem); m_TabCtrl.SetItem(TabIndex, &TabItem); // create Dialogs //m_Dialog3.Create(IDD_DIALOG_3, &m_TabCtrl);------> ASSERT FAILED // Dialog position /* CRect rcItem; ------> ASSERT FAILED m_TabCtrl.GetItemRect(TabIndex, &rcItem); m_Dialog3.SetWindowPos( NULL, rcItem.left, rcItem.bottom + 1, 0, 0, SWP_NOSIZE | SWP_NOZORDER ); */ // show the first dialog //m_Dialog3.ShowWindow(SW_SHOW);------> ASSERT FAILED m_TabCtrl.SetCurFocus(TabIndex); m_TabCtrl.SetCurSel(TabIndex); return true; } void CTest_8View::OnBnClickedButton1() { NewTab(); }
Helft mir bitte, ich komme nicht weiter.
MFG
UInt
-
Hmm, kann das sein, dass die Routine zweimal aufgerufen wird? Das ASSERT prüft nämlich, ob m_Dialog3 bereits ein HWND zugewiesen hat.
Setz mal einen Break-Point (oder Debug To Cursor) auf m_Dialog3.Create, und sieh da vor dem Aufruf nach, ob da das HWND schon gesetzt ist. Wenn ja, muß es irgendwo vorher schon einen Aufruf von Create geben. Evtl. hast du da einen Constructor aufgerufen?
-
Hey Endurion,
du hast Recht. Dialog3 habe ich schon vorher für einen anderen Tab-Control benutzt.
Ich habe einfach einen neuen Dialog für die neuen Tabs gemacht und, um mehrere Tabs mit demselben Dialog offnen zu können, habe ich einen Pointer auf Dialog gemacht.
Danke schön, du hast mir viel geholfen.
MFG
UInt
Ähnliche Themen
-
Array - Neuen Key einfügen
Von Sasser im Forum PHPAntworten: 7Letzter Beitrag: 23.09.10, 12:16 -
Dune 2 neuen Befehl einfügen
Von sight011 im Forum Coders TalkAntworten: 9Letzter Beitrag: 29.04.08, 00:04 -
Neuen Tab einfügen 2
Von UInt im Forum VisualStudio & MFCAntworten: 7Letzter Beitrag: 30.07.07, 10:31 -
Neuen Datensatz einfügen
Von Jerinca im Forum ASPAntworten: 2Letzter Beitrag: 25.10.04, 13:28 -
neuen Datensatz einfügen mit .MD5 für Passwort
Von joky_joky im Forum PHPAntworten: 10Letzter Beitrag: 03.06.04, 22:58





Zitieren
Login






