<?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[Basisklasse für Controls]]></title><description><![CDATA[<p>Morgen :).</p>
<p>Ich würde ganz gerne eine Standardklasse für Controls entwerfen. Konkret geht es erst mal darum, in die Klasse ein statisches CToolTipControl einzubinden. Die Controls sollen dann über eigene Methoden verfügen ihren Tooltiptext zu setzen.<br />
Das Problem ist jetzt, dass man ja eine Klasse dazwischen schieben muss. Der einzige Weg der mir einfällt, um nicht jede bestehende Controlklasse zu verändern, sind Templates. Also in etwa so:</p>
<pre><code class="language-cpp">//ctrlBase.h:
template&lt;class T&gt; class CCtrl : public T
{
...
private:
    static CToolTipCtrl m_tt;
}

//irgendeine Dialogimplementierung:

//Vom Assistenten erzeugtes CEdit
CEdit m_edit
// wird zu:
CCtrl&lt;CMyEdit&gt; m_edit;
</code></pre>
<p>Meine Fragen wären jetzt, geht das überhaupt (T als Basis) und gibt es Besonderheiten bei statischen Variablen innerhalb von Templates zu beachten?<br />
Und das spannendste: Gibts noch einen anderen, besseren Weg?</p>
<p>Viele Grüße,</p>
<p>connan.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183567/basisklasse-für-controls</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 02:05:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183567.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Jun 2007 09:13:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Basisklasse für Controls on Thu, 07 Jun 2007 20:56:51 GMT]]></title><description><![CDATA[<p>Morgen :).</p>
<p>Ich würde ganz gerne eine Standardklasse für Controls entwerfen. Konkret geht es erst mal darum, in die Klasse ein statisches CToolTipControl einzubinden. Die Controls sollen dann über eigene Methoden verfügen ihren Tooltiptext zu setzen.<br />
Das Problem ist jetzt, dass man ja eine Klasse dazwischen schieben muss. Der einzige Weg der mir einfällt, um nicht jede bestehende Controlklasse zu verändern, sind Templates. Also in etwa so:</p>
<pre><code class="language-cpp">//ctrlBase.h:
template&lt;class T&gt; class CCtrl : public T
{
...
private:
    static CToolTipCtrl m_tt;
}

//irgendeine Dialogimplementierung:

//Vom Assistenten erzeugtes CEdit
CEdit m_edit
// wird zu:
CCtrl&lt;CMyEdit&gt; m_edit;
</code></pre>
<p>Meine Fragen wären jetzt, geht das überhaupt (T als Basis) und gibt es Besonderheiten bei statischen Variablen innerhalb von Templates zu beachten?<br />
Und das spannendste: Gibts noch einen anderen, besseren Weg?</p>
<p>Viele Grüße,</p>
<p>connan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299840</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Thu, 07 Jun 2007 20:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Wed, 06 Jun 2007 11:19:05 GMT]]></title><description><![CDATA[<p>Man solls kaum glauben aber der folgende code funktioniert tatsächlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> :</p>
<pre><code class="language-cpp">//ctrl.h
#pragma once

#include &lt;afxcmn.h&gt;

template&lt;class T&gt; class CCtrl : public T
{
public:	
	CCtrl();
	virtual ~CCtrl();

public:
	void SetToolText(LPCTSTR lpszText);

protected:
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	virtual void PreSubclassWindow();

private:
	static CToolTipCtrl m_tt;	

};

template&lt;class T&gt;
CCtrl&lt;T&gt;::CCtrl()
{
	static bool bOnce = true;
	if(bOnce)
	{
		if (!m_tt.Create(this,TTS_ALWAYSTIP))
		{
			TRACE(&quot;Unable To create ToolTip\n&quot;);           
      		}
		else
		{
			m_tt.Activate(true);			
		}
	}
	bOnce=false;
}

template&lt;class T&gt;
CCtrl&lt;T&gt;::~CCtrl()
{
}

template&lt;class T&gt;
void CCtrl&lt;T&gt;::SetToolText(LPCTSTR lpszText)
{
	m_tt.UpdateTipText(lpszText,this);
}

template&lt;class T&gt;
void CCtrl&lt;T&gt;::PreSubclassWindow()
{
	if(!m_tt.AddTool(this,&quot;ToolTip Not Set&quot;))
	{
		TRACE(&quot;Unable To Add ToolTip\n&quot;);
	}
         T::PreSublassWindow();
}

template&lt;class T&gt;
BOOL CCtrl&lt;T&gt;::PreTranslateMessage(MSG* pMsg)
{
	m_tt.RelayEvent(pMsg);
	return T::PreTranslateMessage(pMsg);
}

template&lt;class T&gt;
CToolTipCtrl CCtrl&lt;T&gt;::m_tt;
</code></pre>
<p>In einem Dialog muss dann nur folgendes stehen:<br />
.h:</p>
<pre><code class="language-cpp">CCtrl&lt;CEdit&gt; m_edit;
</code></pre>
<p>.cpp (z.B.OnInitDialog oder DoDataExchange):</p>
<pre><code class="language-cpp">m_edit.SetToolText(&quot;Hallo&quot;);
</code></pre>
<p>das wars.</p>
<p>Aber nur für Controls verwenden <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1299918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299918</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Wed, 06 Jun 2007 11:19:05 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Wed, 06 Jun 2007 11:44:14 GMT]]></title><description><![CDATA[<p>Und warum so kompliziert!<br />
Die MFC unterstützt für jedes CWnd Objekt EnableToolTips!<br />
Dazu ist es nicht nötig für jedes Control ein CToolTipCtrl zu erzeugen. Das ist absolute Ressourcen Vergeudung.</p>
<p>Mehr dazu siehe MSDN<br />
Artikel 188317 und 140595!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299959</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 06 Jun 2007 11:44:14 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Wed, 06 Jun 2007 13:00:58 GMT]]></title><description><![CDATA[<p>--&gt;<a href="http://msdn2.microsoft.com/en-us/library/sa23xtsw(VS.80).aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/sa23xtsw(VS.80).aspx</a><br />
Das findest Du einfacher? Da muß man ja wieder nach den einzelnen ID's der Controls auflösen<br />
Ein weiteres Problem ist, daß so die Angezeigten Tooltips während der Darstellung nicht verändert werden können. Ich wüsste zumindest nicht wie <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> benötige das aber.</p>
<p>btw.: Das ToolTipControl existiert doch nur einmal, ist doch statisch.<br />
EDIT: Das Control existiert für jede Klasse T einmal!</p>
<p>btww.: Wie sucht man in der MSDN nach Artikelnummern <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299982</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Wed, 06 Jun 2007 13:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Wed, 06 Jun 2007 12:36:52 GMT]]></title><description><![CDATA[<p>Klar ist das einfacher!</p>
<p>Zudem werden die Daten doch abgefragt. Sicherlich sind die interaktiv zu ändern. Denn gefüllt werden diese ja auf Anfrage!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299996</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 06 Jun 2007 12:36:52 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Wed, 06 Jun 2007 12:57:17 GMT]]></title><description><![CDATA[<p>Wenn ich das richtig verstehe wird TTN_NEEDTEXTW nur ausgelöst wenn der Tooltip angezeigt werden soll, also nur einmal. Zudem spare ich ich mir ja gerade die ganze Nachrichtenbehandlung. Alles was man noch tun muss ist die ctrl.h zu includieren und CBeliebigesWnd m_wnd mit Ctrl&lt;CBeliebigesWnd&gt; m_wnd zu ersetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300016</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Wed, 06 Jun 2007 12:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Wed, 06 Jun 2007 14:06:25 GMT]]></title><description><![CDATA[<p>Aber es gehen Ressourcen drauf ohne Ende. Und selbst wenn Du solch ein Handling hast.Du könntest ein Standard-System ja auch für die Basisklasse entwickeln...<br />
Aber wie Du meinst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300082</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 06 Jun 2007 14:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Wed, 06 Jun 2007 14:28:53 GMT]]></title><description><![CDATA[<p>Genau da liegt ja mein Problem, um eine Standardklasse zwischen zu schalten muss man ja sämtliche vorhandenen Controlklassen ändern, das würde ich aber gern umgehen.<br />
Vieleicht fehlt mir auch ein bisschen der Einblick wieviele Resourcen so ein ToolTipCtrl wirklich verbraucht. Ich habe jetzt einen Dialog mit ca. 40 Controls, dafür werden insgesamt 5 ToolTipCtrls erstellt, das werden sicher auch noch ein paar mehr, aber ist das schon zu viel?</p>
<p>Kann man vieleicht einem Template irgendwie beibringen, das es die statische Variable wirklich nur einmal geben soll, und nicht für jede class T eine?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300107</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Wed, 06 Jun 2007 14:28:53 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Wed, 06 Jun 2007 18:45:29 GMT]]></title><description><![CDATA[<p>Jedes Tooltip ist ein aktives Fenster und ein Subclass!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300295</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 06 Jun 2007 18:45:29 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Wed, 06 Jun 2007 23:07:44 GMT]]></title><description><![CDATA[<p>Ich weiss schon, ich nerv manchmal ein bisschen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Ist denn, bei dem Weg über EnableTooltips, sichergestellt daß nur ein ToolTipCtrl existiert? Mein MainDlg enthält mehrere Unterdialoge die aber dynamisch erstellt werden müssen, da die Anzahl variiert. D.h. doch daß ich EnableToolTips für jeden Unterdialog aufrufen müsste. Wird denn da nicht intern auch ein weiteres CToolTipCtrl erstellt?</p>
<p>EDIT: Zum vorherigen Post: es zeigt, trotzdem nur 5 ToolTipCtrls existeren, jedes der 40 Controls einen (teilweise dynamischen) ToolTip an! (Nur um Unklarheiten zu beseitigen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300421</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Wed, 06 Jun 2007 23:07:44 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Thu, 07 Jun 2007 07:41:59 GMT]]></title><description><![CDATA[<p>Nein! Für all das benötigt die MFC exakt 1 Tooltip!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300506</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 07 Jun 2007 07:41:59 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Thu, 07 Jun 2007 08:07:29 GMT]]></title><description><![CDATA[<p>Mein Problem ist also, daß für jeden Controltyp ein ToolTipControl erstellt wird. Hast Du da vieleicht noch eine Idee? Jetzt wird ja für jeden Templateparameter T eine Klasse erstellt, damit werden aber auch die statischen Variablen geklont. Meine Idee wäre jetzt das Template noch von einer weiteren Klasse abzuleiten, die die statische Variable enthält, also etwa so:</p>
<pre><code class="language-cpp">class CStaticToolTip
{
public:
    static CToolTipCtrl m_tt;
}

template &lt;class T&gt; CCtrl : public T, public CStaticToolTip
{
...
}
</code></pre>
<p>Damit sollte m_tt nur noch einmal exisitieren. Sieht aber irgendwie nicht schön aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300521</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Thu, 07 Jun 2007 08:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Thu, 07 Jun 2007 09:22:17 GMT]]></title><description><![CDATA[<p>Es funktioniert, nicht ganz so wie gedacht, aber es funktioniert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Es existiert jetzt nur noch ein ToolTipCtrl <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Und zwar wie folgt:</p>
<p>Implementierung der Klasse für das statische TTCtrl:<br />
StaticToolTip.h:</p>
<pre><code class="language-cpp">#pragma once

class CToolTipCtrl;
class CStaticToolTip
{
public:
	CStaticToolTip(CWnd* pWnd);
protected:
	static CToolTipCtrl m_tt;

};
</code></pre>
<p>StaticToolTip.cpp:</p>
<pre><code class="language-cpp">#include &quot;StdAfx.h&quot;
#include &quot;StaticToolTip.h&quot;
#include &lt;afxcmn.h&gt;

CToolTipCtrl CStaticToolTip::m_tt;

CStaticToolTip::CStaticToolTip(CWnd* pWnd)
{
	static bool bOnce = true;    //m_tt.Create darf nur einmal aufgerufen werden!
	if(bOnce)
	{
		if (!m_tt.Create(pWnd,TTS_ALWAYSTIP))
		{
			TRACE(&quot;Unable To create ToolTip\n&quot;);           
    	}
		else
		{
			m_tt.Activate(true);			
		}
	}
	bOnce=false;
}
</code></pre>
<p>Und zu guter Letzt, das Template:<br />
Ctrl.h</p>
<pre><code class="language-cpp">#pragma once

#include &quot;statictooltip.h&quot;

template&lt;class T&gt; class CCtrl : public T, public CStaticToolTip
{
public:	
	CCtrl();
	virtual ~CCtrl();

public:
	void SetToolText(LPCTSTR lpszText);          //Setzen des ToolTextes

protected:
	virtual BOOL PreTranslateMessage(MSG* pMsg); // weiterleiten der Messages an m_tt.RelayEvent
	virtual void PreSubclassWindow();            // Initialisierung des ToolTips bei der Erzeugung des Controls
};

template&lt;class T&gt;
CCtrl&lt;T&gt;::CCtrl() : CStaticToolTip(this)
{
}

template&lt;class T&gt;
CCtrl&lt;T&gt;::~CCtrl()
{
}

template&lt;class T&gt;
void CCtrl&lt;T&gt;::SetToolText(LPCTSTR lpszText)
{
	CStaticToolTip::m_tt.UpdateTipText(lpszText,this);
}

template&lt;class T&gt;
void CCtrl&lt;T&gt;::PreSubclassWindow()
{
	if(!CStaticToolTip::m_tt.AddTool((T*)this,&quot;ToolTip Not Set&quot;))
	{
		TRACE(&quot;Unable To Add ToolTip\n&quot;);
	}
	T::PreSubclassWindow();
}

template&lt;class T&gt;
BOOL CCtrl&lt;T&gt;::PreTranslateMessage(MSG* pMsg)
{
	CStaticToolTip::m_tt.RelayEvent(pMsg);
	return T::PreTranslateMessage(pMsg);
}
</code></pre>
<p>Bsp. zur Benutzung:</p>
<p>CMyDialog.h:</p>
<pre><code class="language-cpp">#include &quot;ctrl.h&quot;
class CMyDialog ...
{
    ...
    CCtrl&lt;CEdit&gt; m_edit; //beliebiges control, vorher CEdit m_edit
    ...
}
</code></pre>
<p>CMyDialog.cpp:</p>
<pre><code class="language-cpp">//z.B. in:
CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    DDX,DDV Aufrufe;
    CString str;
    m_edit.GetWindowText(str);
    m_edit.SetToolText(str); //Dadurch wird der Inhalt des Edits in den ToolTip geschrieben
                      //was auch während dessen Anzeige funktioniert
}
</code></pre>
<p>Na was sagst Du jetzt? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1300556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300556</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Thu, 07 Jun 2007 09:22:17 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Thu, 07 Jun 2007 09:59:17 GMT]]></title><description><![CDATA[<p>Gebe mich geschlagen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":-D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300577</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 07 Jun 2007 09:59:17 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Thu, 07 Jun 2007 10:47:12 GMT]]></title><description><![CDATA[<p>Es war mir eine Ehre! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Danke Dir, hab wieder viel gelernt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1300626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1300626</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Thu, 07 Jun 2007 10:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to Basisklasse für Controls on Mon, 11 Jun 2007 11:50:46 GMT]]></title><description><![CDATA[<p>Hat vieleicht noch jemand eine Idee wie man die Mehrfachvererbung:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class CCtrl : public T, public CStaticToolTip
</code></pre>
<p>auflösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1303062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1303062</guid><dc:creator><![CDATA[connan]]></dc:creator><pubDate>Mon, 11 Jun 2007 11:50:46 GMT</pubDate></item></channel></rss>