Problem mit Dynamisches TabCtrl
-
Also, ich wollte mal eine Klasse schreiben, die ein TabCtrl dynamisch
macht, also nicht über ein statisches array verwaltet, sondern
es ermöglicht zur laufzeit sachen einzufügen.allerdings hab ich ein Problem:
Wenn man auf das letzte Tab klickt, verschwindet das TabCtrl.SourceCode:
DynTab.h:#include <vector> #include <string> using namespace std; class DynTabCtrl : public CTabCtrl { int pos, nmember; vector<CDialog*> tablist; vector<CDialog*>::iterator itablist; public: DynTabCtrl(); // Attribute public: // Operationen public: // Überschreibungen // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen //{{AFX_VIRTUAL(DynTabCtrl) //}}AFX_VIRTUAL // Implementierung public: BOOL InsertItem(CDialog * Dialog, CString title,UINT ID); void SetRec(); virtual ~DynTabCtrl(); // Generierte Nachrichtenzuordnungsfunktionen protected: //{{AFX_MSG(DynTabCtrl) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() };DynTab.cpp
DynTabCtrl::DynTabCtrl() { pos =0; nmember =0; } DynTabCtrl::~DynTabCtrl() { tablist.clear(); } BEGIN_MESSAGE_MAP(DynTabCtrl, CTabCtrl) //{{AFX_MSG_MAP(DynTabCtrl) ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Behandlungsroutinen für Nachrichten DynTabCtrl void DynTabCtrl::SetRec() { CRect tabRec, itemRec; int nX, nY, nXz, nYz; GetClientRect(&tabRec); GetItemRect(0, &itemRec); nX=itemRec.left; nY=itemRec.bottom+1; nXz=tabRec.right-itemRec.left-1; nYz=tabRec.bottom-nY-1; if(!tablist.empty()) { itablist = tablist.begin(); (*itablist)->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_SHOWWINDOW); itablist++; for(; itablist != tablist.end(); itablist++) { (*itablist)->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_HIDEWINDOW); } } } void DynTabCtrl::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen CTabCtrl::OnLButtonDown(nFlags, point); if(pos != GetCurFocus()) { tablist[pos]->ShowWindow(SW_HIDE); pos=GetCurFocus(); tablist[pos]->ShowWindow(SW_SHOW); tablist[pos]->SetFocus(); } } BOOL DynTabCtrl::InsertItem(CDialog *Dialog, CString title, UINT ID) { Dialog->Create(ID,this); if(tablist.empty()) { Dialog->ShowWindow(SW_SHOW); } else Dialog->ShowWindow(SW_HIDE); SetRec(); nmember++; tablist.push_back(Dialog); return CTabCtrl::InsertItem(nmember-1,title); }Einbindung:
void CMyDlg::OnButton1() { m_tabctrl.InsertItem(new DTest(),"test",IDD_TestDialog); m_tabctrl.InsertItem(new testdialog(),"Test",IDD_test); }Hab jetzt schon viel überlegt, aber irgendwie komm ich nicht drauf woran das liegt.
Devil
-
Problem gelöst.
BOOL DynTabCtrl::InsertItem(CDialog *Dialog, CString title, UINT ID) { Dialog->Create(ID,this); if(tablist.empty()) { Dialog->ShowWindow(SW_SHOW); } else Dialog->ShowWindow(SW_HIDE); //SetRec(); nmember++; tablist.push_back(Dialog); SetRec(); //war der Fehler, darf erst nach Pushback aufgerufen werden... return CTabCtrl::InsertItem(nmember-1,title); }Falls das noch nicht in der FAQ gibt, überlegts mal mit dem Verschieben

Devil
-
So, die Klasse ist fast fertig. Problem was ich nun habe ist, das
ich gerne es auch dem User erlauben würde, das er Tabs wieder schliest.
Dazu wollte ich ein Button in der Tabreihe einsetzen. Aber leider
haben versuche in DrawItem() nix gebracht, und meine jetzige Lösung
über ein kontextmenü will ich nicht aus gründen der Usability.
Wo müsste ich den button einfügen ? Bzw. wo werden diese vor und
zurück buttons gezeichnet ?Devil