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


Anmelden zum Antworten