<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit Dynamisches TabCtrl]]></title><description><![CDATA[<p>Also, ich wollte mal eine Klasse schreiben, die ein TabCtrl dynamisch<br />
macht, also nicht über ein statisches array verwaltet, sondern<br />
es ermöglicht zur laufzeit sachen einzufügen.</p>
<p>allerdings hab ich ein Problem:<br />
Wenn man auf das letzte Tab klickt, verschwindet das TabCtrl.</p>
<p>SourceCode:<br />
DynTab.h:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;string&gt;

using namespace std;

class DynTabCtrl : public CTabCtrl
{
	int pos, nmember;
	vector&lt;CDialog*&gt; tablist;
	vector&lt;CDialog*&gt;::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()
};
</code></pre>
<p>DynTab.cpp</p>
<pre><code class="language-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(&amp;tabRec);
	GetItemRect(0, &amp;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)-&gt;SetWindowPos(&amp;wndTop, nX, nY, nXz, nYz, SWP_SHOWWINDOW);
	itablist++;
	for(; itablist != tablist.end(); itablist++)
	{
		(*itablist)-&gt;SetWindowPos(&amp;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]-&gt;ShowWindow(SW_HIDE);
		pos=GetCurFocus();
		tablist[pos]-&gt;ShowWindow(SW_SHOW);
		tablist[pos]-&gt;SetFocus();
	}	
}

BOOL DynTabCtrl::InsertItem(CDialog *Dialog, CString title, UINT ID)
{
	Dialog-&gt;Create(ID,this);
	if(tablist.empty())
	{
		Dialog-&gt;ShowWindow(SW_SHOW);
	}
	else
		Dialog-&gt;ShowWindow(SW_HIDE);
	SetRec();
	nmember++;
	tablist.push_back(Dialog);
	return CTabCtrl::InsertItem(nmember-1,title);
}
</code></pre>
<p>Einbindung:</p>
<pre><code class="language-cpp">void CMyDlg::OnButton1() 
{
	m_tabctrl.InsertItem(new DTest(),&quot;test&quot;,IDD_TestDialog);
	m_tabctrl.InsertItem(new testdialog(),&quot;Test&quot;,IDD_test);
}
</code></pre>
<p>Hab jetzt schon viel überlegt, aber irgendwie komm ich nicht drauf woran das liegt.</p>
<p>Devil</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/48286/problem-mit-dynamisches-tabctrl</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Apr 2026 02:45:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/48286.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Sep 2003 15:35:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Dynamisches TabCtrl on Sun, 07 Sep 2003 15:38:19 GMT]]></title><description><![CDATA[<p>Also, ich wollte mal eine Klasse schreiben, die ein TabCtrl dynamisch<br />
macht, also nicht über ein statisches array verwaltet, sondern<br />
es ermöglicht zur laufzeit sachen einzufügen.</p>
<p>allerdings hab ich ein Problem:<br />
Wenn man auf das letzte Tab klickt, verschwindet das TabCtrl.</p>
<p>SourceCode:<br />
DynTab.h:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;string&gt;

using namespace std;

class DynTabCtrl : public CTabCtrl
{
	int pos, nmember;
	vector&lt;CDialog*&gt; tablist;
	vector&lt;CDialog*&gt;::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()
};
</code></pre>
<p>DynTab.cpp</p>
<pre><code class="language-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(&amp;tabRec);
	GetItemRect(0, &amp;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)-&gt;SetWindowPos(&amp;wndTop, nX, nY, nXz, nYz, SWP_SHOWWINDOW);
	itablist++;
	for(; itablist != tablist.end(); itablist++)
	{
		(*itablist)-&gt;SetWindowPos(&amp;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]-&gt;ShowWindow(SW_HIDE);
		pos=GetCurFocus();
		tablist[pos]-&gt;ShowWindow(SW_SHOW);
		tablist[pos]-&gt;SetFocus();
	}	
}

BOOL DynTabCtrl::InsertItem(CDialog *Dialog, CString title, UINT ID)
{
	Dialog-&gt;Create(ID,this);
	if(tablist.empty())
	{
		Dialog-&gt;ShowWindow(SW_SHOW);
	}
	else
		Dialog-&gt;ShowWindow(SW_HIDE);
	SetRec();
	nmember++;
	tablist.push_back(Dialog);
	return CTabCtrl::InsertItem(nmember-1,title);
}
</code></pre>
<p>Einbindung:</p>
<pre><code class="language-cpp">void CMyDlg::OnButton1() 
{
	m_tabctrl.InsertItem(new DTest(),&quot;test&quot;,IDD_TestDialog);
	m_tabctrl.InsertItem(new testdialog(),&quot;Test&quot;,IDD_test);
}
</code></pre>
<p>Hab jetzt schon viel überlegt, aber irgendwie komm ich nicht drauf woran das liegt.</p>
<p>Devil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/349006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/349006</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Sun, 07 Sep 2003 15:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Dynamisches TabCtrl on Sun, 07 Sep 2003 18:32:19 GMT]]></title><description><![CDATA[<p>Problem gelöst.</p>
<pre><code class="language-cpp">BOOL DynTabCtrl::InsertItem(CDialog *Dialog, CString title, UINT ID) 
{ 
    Dialog-&gt;Create(ID,this); 
    if(tablist.empty()) 
    { 
        Dialog-&gt;ShowWindow(SW_SHOW); 
    } 
    else 
        Dialog-&gt;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); 
}
</code></pre>
<p>Falls das noch nicht in der FAQ gibt, überlegts mal mit dem Verschieben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Devil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/349104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/349104</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Sun, 07 Sep 2003 18:32:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Dynamisches TabCtrl on Sat, 13 Sep 2003 16:44:59 GMT]]></title><description><![CDATA[<p>So, die Klasse ist fast fertig. Problem was ich nun habe ist, das<br />
ich gerne es auch dem User erlauben würde, das er Tabs wieder schliest.<br />
Dazu wollte ich ein Button in der Tabreihe einsetzen. Aber leider<br />
haben versuche in DrawItem() nix gebracht, und meine jetzige Lösung<br />
über ein kontextmenü will ich nicht aus gründen der Usability.<br />
Wo müsste ich den button einfügen ? Bzw. wo werden diese vor und<br />
zurück buttons gezeichnet ?</p>
<p>Devil</p>
]]></description><link>https://www.c-plusplus.net/forum/post/352987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/352987</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Sat, 13 Sep 2003 16:44:59 GMT</pubDate></item></channel></rss>