<?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[MESSAGE_MAP und Templates]]></title><description><![CDATA[<p>So hiho folgendes,</p>
<p>ich nutze OpenGL und wollt mir ne Templateklasse schreiben, in welcher ich meinen OpenGL-Code mit der Fenster-Struktur von der MFC &quot;verbinden&quot; kann, sprich ich will genauso in ein normales CWnd wie auch in ein CStatic zeichnen können.<br />
Um das halbwegs zu automatisieren, muss ich immer die OnPaint,OnSize usw abfangen, was halt relevant ist. Daher sollte meine OpenGL-Klasse als Template-Parameter CWnd oder eine davon abgeleitete Klasse bekommen und selbst dann per Message-Map die entsprechenden Nachricten abfangen.<br />
Nunja nun irgendwie verträgt sich MessageMap aber nicht mit Template-Parametern. Kann man da was machen?</p>
<p>So hab ich mir das ca vorgestellt.<br />
Kompilefehler gibts ab BEGIN_MESSAGE_MAP.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class COpenGLWnd : public T
{
	public:
		typedef T Base;

	protected:
		afx_msg void OnPaint();
		afx_msg void OnSize(UINT nType, int cx, int cy);
		afx_msg BOOL OnEraseBkgnd(CDC* pDC);

		COpenGL m_OpenGL;		

		DECLARE_MESSAGE_MAP()

};

//
BEGIN_MESSAGE_MAP(COpenGLWnd,COpenGLWnd::Base)
	ON_WM_PAINT()
	ON_WM_SIZE()	
	ON_WM_ERASEBKGND()	
END_MESSAGE_MAP()

//
void COpenGLWnd::OnPaint()
{
	Base::OnPaint();
	//...relevanter OpenGL-Code ab hier
}

//
void COpenGLWnd::OnSize(UINT nType, int cx, int cy)
{
	Base::OnSize(nType, cx, cy);
	//...relevanter OpenGL-Code ab hier
}

//
BOOL COpenGLWnd::OnEraseBkgnd(CDC* pDC)
{
	return true;
}
</code></pre>
<blockquote>
<p>e:\quellcode\cpp\naxcam\opengl\openglwnd.h(26) : error C2955: &quot;COpenGLWnd&quot;: Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/topic/164881/message_map-und-templates</link><generator>RSS for Node</generator><lastBuildDate>Fri, 31 Jul 2026 00:52:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/164881.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 13 Nov 2006 15:29:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to MESSAGE_MAP und Templates on Mon, 13 Nov 2006 15:29:26 GMT]]></title><description><![CDATA[<p>So hiho folgendes,</p>
<p>ich nutze OpenGL und wollt mir ne Templateklasse schreiben, in welcher ich meinen OpenGL-Code mit der Fenster-Struktur von der MFC &quot;verbinden&quot; kann, sprich ich will genauso in ein normales CWnd wie auch in ein CStatic zeichnen können.<br />
Um das halbwegs zu automatisieren, muss ich immer die OnPaint,OnSize usw abfangen, was halt relevant ist. Daher sollte meine OpenGL-Klasse als Template-Parameter CWnd oder eine davon abgeleitete Klasse bekommen und selbst dann per Message-Map die entsprechenden Nachricten abfangen.<br />
Nunja nun irgendwie verträgt sich MessageMap aber nicht mit Template-Parametern. Kann man da was machen?</p>
<p>So hab ich mir das ca vorgestellt.<br />
Kompilefehler gibts ab BEGIN_MESSAGE_MAP.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class COpenGLWnd : public T
{
	public:
		typedef T Base;

	protected:
		afx_msg void OnPaint();
		afx_msg void OnSize(UINT nType, int cx, int cy);
		afx_msg BOOL OnEraseBkgnd(CDC* pDC);

		COpenGL m_OpenGL;		

		DECLARE_MESSAGE_MAP()

};

//
BEGIN_MESSAGE_MAP(COpenGLWnd,COpenGLWnd::Base)
	ON_WM_PAINT()
	ON_WM_SIZE()	
	ON_WM_ERASEBKGND()	
END_MESSAGE_MAP()

//
void COpenGLWnd::OnPaint()
{
	Base::OnPaint();
	//...relevanter OpenGL-Code ab hier
}

//
void COpenGLWnd::OnSize(UINT nType, int cx, int cy)
{
	Base::OnSize(nType, cx, cy);
	//...relevanter OpenGL-Code ab hier
}

//
BOOL COpenGLWnd::OnEraseBkgnd(CDC* pDC)
{
	return true;
}
</code></pre>
<blockquote>
<p>e:\quellcode\cpp\naxcam\opengl\openglwnd.h(26) : error C2955: &quot;COpenGLWnd&quot;: Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1173760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1173760</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 13 Nov 2006 15:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to MESSAGE_MAP und Templates on Mon, 13 Nov 2006 19:08:21 GMT]]></title><description><![CDATA[<p>Das funktioniert nicht, weil die Makros der MFC direkt den Klassennamen verwenden um daraus einen neuen Bezeichner zu bauen. Das geht aber mit templates nicht.<br />
IMHO gibt es eine &quot;hanebüchende&quot; Lösung bei <a href="http://www.codeproject.com" rel="nofollow">www.codeproject.com</a></p>
<p>Die Frage wäreob Du hier nicht einfacher CSubclassWnd (DiLascia) oder CHookWnd (<a href="http://www.naughter.com" rel="nofollow">www.naughter.com</a>) verwendest. Das ist klassisches Subclassing das zumindest genau so etwas wie templatefunktionalität ermöglicht.</p>
<p>Ich persönlich arbeite sehr gerne mit der Variante von P.J. Naughter, an dem guten Stück habe ich Teile mitentworfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1173946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1173946</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 13 Nov 2006 19:08:21 GMT</pubDate></item></channel></rss>