MESSAGE_MAP und Templates



  • So hiho folgendes,

    ich nutze OpenGL und wollt mir ne Templateklasse schreiben, in welcher ich meinen OpenGL-Code mit der Fenster-Struktur von der MFC "verbinden" kann, sprich ich will genauso in ein normales CWnd wie auch in ein CStatic zeichnen können.
    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.
    Nunja nun irgendwie verträgt sich MessageMap aber nicht mit Template-Parametern. Kann man da was machen?

    So hab ich mir das ca vorgestellt.
    Kompilefehler gibts ab BEGIN_MESSAGE_MAP.

    template<class T>
    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;
    }
    

    e:\quellcode\cpp\naxcam\opengl\openglwnd.h(26) : error C2955: "COpenGLWnd": Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.


  • Mod

    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.
    IMHO gibt es eine "hanebüchende" Lösung bei www.codeproject.com

    Die Frage wäreob Du hier nicht einfacher CSubclassWnd (DiLascia) oder CHookWnd (www.naughter.com) verwendest. Das ist klassisches Subclassing das zumindest genau so etwas wie templatefunktionalität ermöglicht.

    Ich persönlich arbeite sehr gerne mit der Variante von P.J. Naughter, an dem guten Stück habe ich Teile mitentworfen.


Anmelden zum Antworten