<?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[Wie die Callback Routine in Klasse integrieren?]]></title><description><![CDATA[<p>Ich arbeite derzeit an einer DLL die DirectX nutzt. Diese ist rein objektorientiert und erzeugt beim Aufruf ein eignes Fenster in dem das Ganze dann stattfindet. Leider bekomm ich es nicht hin, die Callback-Routine des Fensters, die die Windows-Nachrichten bearbeitet, in eine Klasse zu integrieren. Woran liegt das? Wie kann ich das machen?</p>
<p>Hier die entsprechenden Stellen des Quelltextes:</p>
<p><strong>Das Erstellen des Fensters:</strong></p>
<pre><code class="language-cpp">bool CEngine::InitWindow(HWND hParentWnd)
{
	WNDCLASSEX	wndStruct;	// Struktur der Fenster-Eigenschaften

	// Eigenschaften des Fensters festlegen
	wndStruct.hInstance		= m_hInstance;				// Die erstellende Instanz (Prozess)
	wndStruct.lpszClassName = &quot;Test&quot;;		// Name des Fensters
	wndStruct.lpfnWndProc	= WinEvents;				// Callback Routine für Ereignisse
	wndStruct.style			= CS_HREDRAW | CS_VREDRAW;			// Fensterart 
	wndStruct.cbSize		= sizeof(WNDCLASSEX);				// Größe in Bytes    
	wndStruct.hIcon			= LoadIcon(NULL, IDI_APPLICATION);	// Standard-Icon nutzen
	wndStruct.hIconSm		= LoadIcon(NULL, IDI_APPLICATION);	// kleines Icon = Standard
	wndStruct.hCursor		= LoadCursor(NULL, IDC_ARROW);		// normaler Mauszeiger
	wndStruct.lpszMenuName	= NULL;								// kein Menü vorhanden
	wndStruct.cbClsExtra	= 0;								// keinerlei Extras
	wndStruct.cbWndExtra	= 0;
    wndStruct.hbrBackground = (HBRUSH)COLOR_BACKGROUND;	// Hintergrundfarbe = Standard

	// Versuche die Fenster-Klasse anzumelden, ansonsten Fehler zurückgeben
	if (!RegisterClassEx(&amp;wndStruct))
	{
		ERRORMSG(&quot;Fenster-Klasse konnte nicht registriert werden!&quot;,&quot;InitWindow();&quot;);
		return false;
	}

	// das Hauptfenster wird erzeugt
	m_hWnd = CreateWindowEx(0, &quot;Test&quot;, &quot;Test&quot;, WS_OVERLAPPEDWINDOW,
							200, 100, m_Config.GetScreenWidth(), m_Config.GetScreenHeight(), 
							hParentWnd, NULL, m_hInstance, NULL);

	ShowWindow(m_hWnd, SW_SHOW);

	return true;
}	// ~CEngine::InitWindow();
</code></pre>
<p><strong>Die Callback Routine:</strong></p>
<pre><code class="language-cpp">LRESULT CALLBACK WinEvents(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uiMsg)				// nach Nachrichtentyp unterscheiden
	{
		case WM_KEYDOWN:
		{
			switch(wParam)
			{
				case VK_ESCAPE:
				{					
					DestroyWindow(hWnd);
					break;
				}
			}

		}

	}	// ~switch(uiMsg);

	// wurde kein passender Nachrichtentyp gefunden, Nachricht an Windows weiterleiten
	return DefWindowProc(hWnd, uiMsg, wParam, lParam);
}
</code></pre>
<p><strong>Die Definition der Klasse:</strong></p>
<pre><code class="language-cpp">class __declspec(dllexport) CEngine
{
public:
			// Der Konstruktor
			CEngine(HINSTANCE hInst, HWND hParentWnd, CParameters params, CNoiseData nData);
			~CEngine(void);		// Der Destruktor	

	void		MainLoop(void);		// Die Hauptschleife der 3D-Anwendung
	inline bool	IsRunning(void)	{ return m_bRunning; }	// Prüft ob die Anwendung noch läuft

protected:
	bool	InitWindow(HWND hParentWnd);	// legt das Fenster der Anwendung an	
	bool	InitD3D(void);		// Initialisiert Direct 3D
	bool	InitScene(void);	// Initialisiert die Szenerie nach TaskSwitch oder Init
	void	ShutDown(void);		// Räumt die Anwendung auf
	bool	Render(void);		// Render das aktuelle Bild

private:
	bool		m_bRunning;		// Gibt an, ob die Anwendung noch läuft

	// Objekte zur Fensterverwaltung
	HINSTANCE	m_hInstance;	// Handle der startenden Instanz
	MSG			m_msgEvent;		// Nachrichten Objekt des Hauptfensters
	HWND		m_hWnd;			// das Fenster Handle	

	// Objekte für Direct 3D
	D3DXMATRIX				m_matProjection;		// Die Projektionsmatrix
	LPDIRECT3D9				m_pD3DObject;			// Das Direct-3D Objekt (Zeiger)
	LPDIRECT3DDEVICE9		m_pD3DDevice;			// Das Direct-3D Geräte-Device (Zeiger)
	D3DPRESENT_PARAMETERS	m_PresentParameters;	// Struktur mit D3D Eigenschaften

};	// ~class CEngine;

// Callback Routine für Windows-Nachrichten
LRESULT CALLBACK WinEvents(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);
</code></pre>
<p>Wenn ich nun einfach den Funktionsprototypen in die Klasse verschiebe und als Klassenmethode ansehe, dazu den Namen der Funktion von WinEvents in CEngine::WinEvents ändere und compile kommt folgendes:</p>
<blockquote>
<p>error C3867: &quot;CEngine::WinEvents&quot;: Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie &quot;&amp;CEngine::WinEvents&quot;, um einen Zeiger auf den Member zu erstellen.</p>
</blockquote>
<p>Wenn ich dann &quot;wndStruct.lpfnWndProc = WinEvents;&quot; durch &quot;wndStruct.lpfnWndProc = &amp;CEngine::WinEvents;&quot; ersetze, so kommt ein neuer Fehler:</p>
<blockquote>
<p>error C2440: '=': 'LRESULT (__stdcall CEngine::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werden</p>
</blockquote>
<p>Kann mir da jemand erzählen wie ich das zum laufen bekomme?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/176354/wie-die-callback-routine-in-klasse-integrieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 27 Jun 2026 09:17:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/176354.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Mar 2007 13:54:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 13:54:20 GMT]]></title><description><![CDATA[<p>Ich arbeite derzeit an einer DLL die DirectX nutzt. Diese ist rein objektorientiert und erzeugt beim Aufruf ein eignes Fenster in dem das Ganze dann stattfindet. Leider bekomm ich es nicht hin, die Callback-Routine des Fensters, die die Windows-Nachrichten bearbeitet, in eine Klasse zu integrieren. Woran liegt das? Wie kann ich das machen?</p>
<p>Hier die entsprechenden Stellen des Quelltextes:</p>
<p><strong>Das Erstellen des Fensters:</strong></p>
<pre><code class="language-cpp">bool CEngine::InitWindow(HWND hParentWnd)
{
	WNDCLASSEX	wndStruct;	// Struktur der Fenster-Eigenschaften

	// Eigenschaften des Fensters festlegen
	wndStruct.hInstance		= m_hInstance;				// Die erstellende Instanz (Prozess)
	wndStruct.lpszClassName = &quot;Test&quot;;		// Name des Fensters
	wndStruct.lpfnWndProc	= WinEvents;				// Callback Routine für Ereignisse
	wndStruct.style			= CS_HREDRAW | CS_VREDRAW;			// Fensterart 
	wndStruct.cbSize		= sizeof(WNDCLASSEX);				// Größe in Bytes    
	wndStruct.hIcon			= LoadIcon(NULL, IDI_APPLICATION);	// Standard-Icon nutzen
	wndStruct.hIconSm		= LoadIcon(NULL, IDI_APPLICATION);	// kleines Icon = Standard
	wndStruct.hCursor		= LoadCursor(NULL, IDC_ARROW);		// normaler Mauszeiger
	wndStruct.lpszMenuName	= NULL;								// kein Menü vorhanden
	wndStruct.cbClsExtra	= 0;								// keinerlei Extras
	wndStruct.cbWndExtra	= 0;
    wndStruct.hbrBackground = (HBRUSH)COLOR_BACKGROUND;	// Hintergrundfarbe = Standard

	// Versuche die Fenster-Klasse anzumelden, ansonsten Fehler zurückgeben
	if (!RegisterClassEx(&amp;wndStruct))
	{
		ERRORMSG(&quot;Fenster-Klasse konnte nicht registriert werden!&quot;,&quot;InitWindow();&quot;);
		return false;
	}

	// das Hauptfenster wird erzeugt
	m_hWnd = CreateWindowEx(0, &quot;Test&quot;, &quot;Test&quot;, WS_OVERLAPPEDWINDOW,
							200, 100, m_Config.GetScreenWidth(), m_Config.GetScreenHeight(), 
							hParentWnd, NULL, m_hInstance, NULL);

	ShowWindow(m_hWnd, SW_SHOW);

	return true;
}	// ~CEngine::InitWindow();
</code></pre>
<p><strong>Die Callback Routine:</strong></p>
<pre><code class="language-cpp">LRESULT CALLBACK WinEvents(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uiMsg)				// nach Nachrichtentyp unterscheiden
	{
		case WM_KEYDOWN:
		{
			switch(wParam)
			{
				case VK_ESCAPE:
				{					
					DestroyWindow(hWnd);
					break;
				}
			}

		}

	}	// ~switch(uiMsg);

	// wurde kein passender Nachrichtentyp gefunden, Nachricht an Windows weiterleiten
	return DefWindowProc(hWnd, uiMsg, wParam, lParam);
}
</code></pre>
<p><strong>Die Definition der Klasse:</strong></p>
<pre><code class="language-cpp">class __declspec(dllexport) CEngine
{
public:
			// Der Konstruktor
			CEngine(HINSTANCE hInst, HWND hParentWnd, CParameters params, CNoiseData nData);
			~CEngine(void);		// Der Destruktor	

	void		MainLoop(void);		// Die Hauptschleife der 3D-Anwendung
	inline bool	IsRunning(void)	{ return m_bRunning; }	// Prüft ob die Anwendung noch läuft

protected:
	bool	InitWindow(HWND hParentWnd);	// legt das Fenster der Anwendung an	
	bool	InitD3D(void);		// Initialisiert Direct 3D
	bool	InitScene(void);	// Initialisiert die Szenerie nach TaskSwitch oder Init
	void	ShutDown(void);		// Räumt die Anwendung auf
	bool	Render(void);		// Render das aktuelle Bild

private:
	bool		m_bRunning;		// Gibt an, ob die Anwendung noch läuft

	// Objekte zur Fensterverwaltung
	HINSTANCE	m_hInstance;	// Handle der startenden Instanz
	MSG			m_msgEvent;		// Nachrichten Objekt des Hauptfensters
	HWND		m_hWnd;			// das Fenster Handle	

	// Objekte für Direct 3D
	D3DXMATRIX				m_matProjection;		// Die Projektionsmatrix
	LPDIRECT3D9				m_pD3DObject;			// Das Direct-3D Objekt (Zeiger)
	LPDIRECT3DDEVICE9		m_pD3DDevice;			// Das Direct-3D Geräte-Device (Zeiger)
	D3DPRESENT_PARAMETERS	m_PresentParameters;	// Struktur mit D3D Eigenschaften

};	// ~class CEngine;

// Callback Routine für Windows-Nachrichten
LRESULT CALLBACK WinEvents(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);
</code></pre>
<p>Wenn ich nun einfach den Funktionsprototypen in die Klasse verschiebe und als Klassenmethode ansehe, dazu den Namen der Funktion von WinEvents in CEngine::WinEvents ändere und compile kommt folgendes:</p>
<blockquote>
<p>error C3867: &quot;CEngine::WinEvents&quot;: Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie &quot;&amp;CEngine::WinEvents&quot;, um einen Zeiger auf den Member zu erstellen.</p>
</blockquote>
<p>Wenn ich dann &quot;wndStruct.lpfnWndProc = WinEvents;&quot; durch &quot;wndStruct.lpfnWndProc = &amp;CEngine::WinEvents;&quot; ersetze, so kommt ein neuer Fehler:</p>
<blockquote>
<p>error C2440: '=': 'LRESULT (__stdcall CEngine::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werden</p>
</blockquote>
<p>Kann mir da jemand erzählen wie ich das zum laufen bekomme?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249126</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Tue, 20 Mar 2007 13:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 14:27:53 GMT]]></title><description><![CDATA[<p>static ... und naja guck dir mal funktionspointer usw an ... du hast da etwas übersehen <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/1249150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249150</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 20 Mar 2007 14:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 14:51:02 GMT]]></title><description><![CDATA[<p>musste vor kurzem selber an der selben krankheit sterben. man schaue hier für Medikamente dagegen:</p>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-174421.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-174421.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249168</guid><dc:creator><![CDATA[Azrael* il Meraz]]></dc:creator><pubDate>Tue, 20 Mar 2007 14:51:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 15:08:17 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich hatte da (s. azraels link) eine antwort gepostet, die allerdings compilerspezifisch war und unsauber war, hier nun eine sehr elegante Lösung des Problems.<br />
Angenommen, deine Klasse heißt CMainWnd, dann musst du diese so deklarieren:</p>
<pre><code class="language-cpp">#ifndef _CMAINWND_H_
#define _CMAINWND_H_

#include &lt;windows.h&gt;
#include &quot;CWndUnknown.h&quot;

class CMainWnd : public CWndUnknown
{
public:
	CMainWnd();
	~CMainWnd();

private:

	// message processing function:
	virtual LRESULT ProcessWindowMessage(HWND, UINT, WPARAM, LPARAM);
};

#endif
</code></pre>
<p>Wichtig ist dabei, dass du die Klasse CWndUnknown davon ableitest und du deine Callback-Funktion so deklarierst.</p>
<p>Die Klasse CWndUnknown sieht so aus:<br />
Header-Datei:</p>
<pre><code class="language-cpp">#ifndef _CWNDUNKNOWN_H_
#define _CWNDUNKNOWN_H_

#include &lt;windows.h&gt;

class CWndUnknown
{
public:
	static bool Init(HINSTANCE);

	void* GetUnknownClassPtr();

	static TCHAR* GetUnknownClassName();
	static WNDPROC GetStartWndProc();

protected:
	static LRESULT CALLBACK StartWindowProc(HWND, UINT, WPARAM, LPARAM);

	virtual LRESULT ProcessWindowMessage(HWND, UINT, WPARAM, LPARAM);

};

#endif
</code></pre>
<p>C++ - Datei:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &quot;CWndUnknown.h&quot;

bool CWndUnknown::Init(HINSTANCE hInst)
{
	WNDCLASSEX wc;
	wc.cbSize		= sizeof(WNDCLASSEX);
    wc.cbClsExtra	= 0;
    wc.cbWndExtra	= 0;
    wc.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc.hCursor		= LoadCursor(0, IDC_ARROW);
    wc.hIcon		= 0;
    wc.hIconSm		= 0;
    wc.hInstance	= hInst;
    wc.lpfnWndProc	= GetStartWndProc();
    wc.lpszClassName= GetUnknownClassName();
    wc.lpszMenuName	= 0;
    wc.style		= 0;
    if(!RegisterClassEx(&amp;wc))
        return false;

	return true;
}

LRESULT CALLBACK CWndUnknown::StartWindowProc(HWND hwnd, UINT message,
								WPARAM wParam, LPARAM lParam)
{
	if(message == WM_CREATE)
	{
		SetWindowLongPtr(hwnd, GWLP_USERDATA,
			(LONG_PTR)(((LPCREATESTRUCT)lParam)-&gt;lpCreateParams));
	}

	CWndUnknown *pUnknown;
	if(pUnknown = (CWndUnknown*)GetWindowLongPtr(hwnd, GWLP_USERDATA))
		return pUnknown-&gt;ProcessWindowMessage(hwnd, message, wParam, lParam);
	return DefWindowProc(hwnd, message, wParam, lParam);
}

LRESULT CWndUnknown::ProcessWindowMessage(HWND hwnd, UINT message,
								WPARAM wParam, LPARAM lParam)
{
	return 0;
}

void* CWndUnknown::GetUnknownClassPtr()
{
	return this;
}

WNDPROC CWndUnknown::GetStartWndProc()
{
	return (WNDPROC)&amp;StartWindowProc;
}

TCHAR* CWndUnknown::GetUnknownClassName()
{
	return &quot;DeinKlassenname&quot;;
}
</code></pre>
<p>Du musst lediglich, bevor du das Fesnter erstellst, die Fensterklasse registrieren mittels CWndUnknown::Init(hInstance);<br />
Sonst brauchst du dich um nichts zu kümmern. CWndUnknown tut nämlich den Pointer auf sich selbst im Userdate-Bereich eines Fensters speichern und bei einer Message diesen auslesen und an ProcessWindowMessage() weiterleiten. Da diese Funktion aber mit virtual deklariert ist, wird dafür die ProcessWindowMessage-Funktion aus CMainWnd benutzt.</p>
<p>[edit]selbstverständlich kannst du auch die Fensterklasse wie gewohnt zum Programmstart deklarieren und die Ini-Anweisung raushauen ... wichtig ist, dass eben die CALLBACK-Funktion bei WNDCLASSEX.lpfnWndProc auf CWndUnknown::GetStartWndProc() gesetzt wird.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249174</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 15:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 15:52:56 GMT]]></title><description><![CDATA[<p>also der letzte Teil ist mir etwas viel grad auf einmal...</p>
<p>Wollte das was du als Edit geschrieben hast versuchen und die Init weglassen und meine &quot;alte dafür nehmen. Welche der ganzen Methoden von CUnknownWnd brauch ich eigentlich, bzw was machen die genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249212</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Tue, 20 Mar 2007 15:52:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 16:25:36 GMT]]></title><description><![CDATA[<p>du musst die windowclass eben mit GetStartWndProc() initialisieren und diese registrieren, das init() brauchste dannn net. in deiner klasse musst du CWndUnknown ableiten ( : CWndUnknown), die Callback-funktion als virtual deklarieren und ProcessWindowMessage benennen (statt WinEvents), das wars. Oh was ich vergaß: bei createwindowex als letzten parameter GetUnknownClassPtr() angeben.<br />
Wenn du mehrere Instanzen deines Fenster machen willst (bzw deiner fensterklasse) würde ich auch das Registrieren der Fensterklasse aus der Klasse raushauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249232</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 16:25:36 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 16:37:20 GMT]]></title><description><![CDATA[<p>Habs mal in dienen Code eingefügt:</p>
<p><strong>Das Erstellen des Fensters:</strong></p>
<pre><code class="language-cpp">bool CEngine::InitWindow(HWND hParentWnd)
{
	WNDCLASSEX	wndStruct;	// Struktur der Fenster-Eigenschaften

	// Eigenschaften des Fensters festlegen
	wndStruct.hInstance		= m_hInstance;				// Die erstellende Instanz (Prozess)
	wndStruct.lpszClassName = &quot;Klassenname&quot;;		// Das ist nicht der Name (Titel) sondern der Klassenname!!!
	wndStruct.lpfnWndProc	= GetStartWndProc()			// Callback Routine für Ereignisse !!!
	wndStruct.style			= CS_HREDRAW | CS_VREDRAW;			// Fensterart 
	wndStruct.cbSize		= sizeof(WNDCLASSEX);				// Größe in Bytes    
	wndStruct.hIcon			= LoadIcon(NULL, IDI_APPLICATION);	// Standard-Icon nutzen
	wndStruct.hIconSm		= LoadIcon(NULL, IDI_APPLICATION);	// kleines Icon = Standard
	wndStruct.hCursor		= LoadCursor(NULL, IDC_ARROW);		// normaler Mauszeiger
	wndStruct.lpszMenuName	= NULL;								// kein Menü vorhanden
	wndStruct.cbClsExtra	= 0;								// keinerlei Extras
	wndStruct.cbWndExtra	= 0;
    wndStruct.hbrBackground = (HBRUSH)COLOR_BACKGROUND;	// Hintergrundfarbe = Standard

	// Versuche die Fenster-Klasse anzumelden, ansonsten Fehler zurückgeben
	if (!RegisterClassEx(&amp;wndStruct))
	{
		ERRORMSG(&quot;Fenster-Klasse konnte nicht registriert werden!&quot;,&quot;InitWindow();&quot;);
		return false;
	}

	// das Hauptfenster wird erzeugt
	m_hWnd = CreateWindowEx(0, &quot;Test&quot;, &quot;Test&quot;, WS_OVERLAPPEDWINDOW,
							200, 100, m_Config.GetScreenWidth(), m_Config.GetScreenHeight(), 
							hParentWnd, NULL, m_hInstance, GetUnknownClassPtr()); // !!!!

	ShowWindow(m_hWnd, SW_SHOW);

	return true;
}	// ~CEngine::InitWindow();
</code></pre>
<p>Diese musst du so umbenennen:<br />
<strong>Die Callback Routine:</strong></p>
<pre><code class="language-cpp">LRESULT CEngine::ProcessWindowMessage(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uiMsg)				// nach Nachrichtentyp unterscheiden
	{
		case WM_KEYDOWN:
		{
			switch(wParam)
			{
				case VK_ESCAPE:
				{					
					DestroyWindow(hWnd);
					break;
				}
			}

		}

	}	// ~switch(uiMsg);

	// wurde kein passender Nachrichtentyp gefunden, Nachricht an Windows weiterleiten
	return DefWindowProc(hWnd, uiMsg, wParam, lParam);
}
</code></pre>
<p><strong>Die Definition der Klasse:</strong><br />
#include &quot;CWndUnknown.h&quot;</p>
<pre><code class="language-cpp">class __declspec(dllexport) CEngine : public CWndUnknown // !!!
{
public:
			// Der Konstruktor
			CEngine(HINSTANCE hInst, HWND hParentWnd, CParameters params, CNoiseData nData);
			~CEngine(void);		// Der Destruktor	

	void		MainLoop(void);		// Die Hauptschleife der 3D-Anwendung
	inline bool	IsRunning(void)	{ return m_bRunning; }	// Prüft ob die Anwendung noch läuft

protected:
	bool	InitWindow(HWND hParentWnd);	// legt das Fenster der Anwendung an	
	bool	InitD3D(void);		// Initialisiert Direct 3D
	bool	InitScene(void);	// Initialisiert die Szenerie nach TaskSwitch oder Init
	void	ShutDown(void);		// Räumt die Anwendung auf
	bool	Render(void);		// Render das aktuelle Bild

private:
	bool		m_bRunning;		// Gibt an, ob die Anwendung noch läuft

	// Objekte zur Fensterverwaltung
	HINSTANCE	m_hInstance;	// Handle der startenden Instanz
	MSG			m_msgEvent;		// Nachrichten Objekt des Hauptfensters
	HWND		m_hWnd;			// das Fenster Handle	

	// Objekte für Direct 3D
	D3DXMATRIX				m_matProjection;		// Die Projektionsmatrix
	LPDIRECT3D9				m_pD3DObject;			// Das Direct-3D Objekt (Zeiger)
	LPDIRECT3DDEVICE9		m_pD3DDevice;			// Das Direct-3D Geräte-Device (Zeiger)
	D3DPRESENT_PARAMETERS	m_PresentParameters;	// Struktur mit D3D Eigenschaften
// Callback Routine für Windows-Nachrichten
virtual LRESULT ProcessWindowMessage(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam); // !!!!!

};	// ~class CEngine;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1249241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249241</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 16:37:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 17:38:13 GMT]]></title><description><![CDATA[<p>also hab das versucht, allerdings meldet er jetzt immer:</p>
<blockquote>
<p>'ProcWndMsg': Ist kein Element von 'CWndEvents'</p>
</blockquote>
<p>Wenn ich diese Methode mit als Mitglied von der Unknown Klasse mache geht es, allerdings kann ich dann nicht von dieser auf die Variablen von CEngine zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249275</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Tue, 20 Mar 2007 17:38:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 17:47:54 GMT]]></title><description><![CDATA[<p>Wie kommst du auf ProcWndMsg ??? Davon habe ich nie was geschrieben.<br />
Vielleicht solltest du dich erstmal mit den Basics beschäftigen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249277</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 17:47:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 17:59:40 GMT]]></title><description><![CDATA[<p>Ich hab die Namen der Methoden einfach etwas geändert. Bei dir hieß sie ProcessWindowMessage()</p>
<p>Das Grundproblem liegt darin, das die abgeleitete Fensterklasse die Methode der Basisklasse nicht kennt. (bzw andersrum)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249279</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Tue, 20 Mar 2007 17:59:40 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 17:56:41 GMT]]></title><description><![CDATA[<p>kokunze schrieb:</p>
<blockquote>
<p>Ich hab die Namen der Methoden einfach etwas geändert. Bei dir hieß sie ProcessWindowMessage()</p>
</blockquote>
<p>omg - und wie soll ich mit dieser information was anfangen können???<br />
versetz dich doch in meine situation - glaubst du mit deiner aussage kann ich dir irgendwie helfen, wenn du irgendwelche namen irgendwo änderst und es dann nicht mehr funktioniert?<br />
Specke dienen Code aufs WESENTLICHE ab und poste ihn hier nochmal <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/1249281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249281</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 17:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 17:58:54 GMT]]></title><description><![CDATA[<p>Toll jetzt editierst du - es gibt auch ein Vorschau-Button <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="🙄"
    /> <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="😮"
    /> .<br />
Wenn du ProcessWindowMessage() in CEngine änderst musst du das natürlich auch in CWndUnkonwn ändern, hatte ich oben geschrieben: &quot;in deiner klasse musst du CWndUnknown ableiten ( : CWndUnknown), die Callback-funktion als virtual deklarieren und ProcessWindowMessage benennen&quot;. Aber wenn du dich nicht daran halten willst, dann kann ich dir auch nicht helfen, verarschen lassen tun wir uns hier nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249284</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 17:58:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 18:15:41 GMT]]></title><description><![CDATA[<p>Black Shadow schrieb:</p>
<blockquote>
<p>Toll jetzt editierst du - es gibt auch ein Vorschau-Button <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="🙄"
    /> <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="😮"
    /> .<br />
Wenn du ProcessWindowMessage() in CEngine änderst musst du das natürlich auch in CWndUnkonwn ändern, hatte ich oben geschrieben: &quot;in deiner klasse musst du CWndUnknown ableiten ( : CWndUnknown), die Callback-funktion als virtual deklarieren und ProcessWindowMessage benennen&quot;. Aber wenn du dich nicht daran halten willst, dann kann ich dir auch nicht helfen, verarschen lassen tun wir uns hier nicht.</p>
</blockquote>
<p>Natürlich hab ich die Namen an allen entsprechenden Stellen geändert. Nur weil ich andere Methoden-und Klassennamen benutze muss es ja nicht falsch sein. Was bei dir CWndUnknown ist, ist bei mir CWndEvents. Der Rest sind eigentlich nur Abkürzungen. Ich zeig einfach mal die Auszüge wie es jetz bei mir aussieht.</p>
<p><strong>Die Klasse CEngine</strong></p>
<pre><code class="language-cpp">class __declspec(dllexport) CEngine : public CWndEvents
{
public:
			// Der Konstruktor
			CEngine(HINSTANCE hInst, HWND hParentWnd, CParameters params, CNoiseData nData);
			~CEngine(void);		// Der Destruktor	

	void		MainLoop(void);		// Die Hauptschleife der 3D-Anwendung
	inline bool	IsRunning(void)	{ return m_bRunning; }	// Prüft ob die Anwendung noch läuft

protected:
	bool	InitWindow(HWND hParentWnd);	// legt das Fenster der Anwendung an	
	bool	InitD3D(void);		// Initialisiert Direct 3D
	bool	InitScene(void);	// Initialisiert die Szenerie nach TaskSwitch oder Init
	void	ShutDown(void);		// Räumt die Anwendung auf
	bool	Render(void);		// Render das aktuelle Bild

private:
	bool		m_bRunning;		// Gibt an, ob die Anwendung noch läuft

	// Objekte zur Fensterverwaltung
	HINSTANCE	m_hInstance;	// Handle der startenden Instanz
	MSG			m_msgEvent;		// Nachrichten Objekt des Hauptfensters
	HWND		m_hWnd;			// das Fenster Handle	

	// Objekte für Direct 3D
	D3DXMATRIX				m_matProjection;		// Die Projektionsmatrix
	LPDIRECT3D9				m_pD3DObject;			// Das Direct-3D Objekt (Zeiger)
	LPDIRECT3DDEVICE9		m_pD3DDevice;			// Das Direct-3D Geräte-Device (Zeiger)
	D3DPRESENT_PARAMETERS	m_PresentParameters;	// Struktur mit D3D Eigenschaften

	// Methode zum Auswerten und Weiterleiten der Nachrichten
	virtual LRESULT ProcWndMsg(HWND, UINT, WPARAM, LPARAM);

};	// ~class CEngine;
</code></pre>
<p><strong>CEngine::InitWindow</strong></p>
<pre><code class="language-cpp">bool CEngine::InitWindow(HWND hParentWnd)
{
	WNDCLASSEX	wndStruct;	// Struktur der Fenster-Eigenschaften

	// Eigenschaften des Fensters festlegen
	wndStruct.hInstance		= m_hInstance;				// Die erstellende Instanz (Prozess)
	wndStruct.lpszClassName = &quot;Test&quot;;		// Name der Fensterklasse
	wndStruct.lpfnWndProc	= GetStartWndProc();		// Callback Routine für Ereignisse
	wndStruct.style			= CS_HREDRAW | CS_VREDRAW;			// Fensterart 
	wndStruct.cbSize		= sizeof(WNDCLASSEX);				// Größe in Bytes    
	wndStruct.hIcon			= LoadIcon(NULL, IDI_APPLICATION);	// Standard-Icon nutzen
	wndStruct.hIconSm		= LoadIcon(NULL, IDI_APPLICATION);	// kleines Icon = Standard
	wndStruct.hCursor		= LoadCursor(NULL, IDC_ARROW);		// normaler Mauszeiger
	wndStruct.lpszMenuName	= NULL;								// kein Menü vorhanden
	wndStruct.cbClsExtra	= 0;								// keinerlei Extras
	wndStruct.cbWndExtra	= 0;
    wndStruct.hbrBackground = (HBRUSH)COLOR_BACKGROUND;	// Hintergrundfarbe = Standard

	// Versuche die Fenster-Klasse anzumelden, ansonsten Fehler zurückgeben
	if (!RegisterClassEx(&amp;wndStruct))
	{
		ERRORMSG(&quot;Fenster-Klasse konnte nicht registriert werden!&quot;,&quot;InitWindow();&quot;);
		return false;
	}

	// das Hauptfenster wird erzeugt
	m_hWnd = CreateWindowEx(0, &quot;Test&quot;, &quot;Test&quot;, WS_OVERLAPPEDWINDOW,
							200, 100, m_Config.GetScreenWidth(), m_Config.GetScreenHeight(), 
							hParentWnd, NULL, m_hInstance, GetEventClassPtr());

	ShowWindow(m_hWnd, SW_SHOW);

	return true;
}	// ~CEngine::InitWindow();
</code></pre>
<p><strong>CEngine::ProcWndMsg</strong></p>
<pre><code class="language-cpp">LRESULT CEngine::ProcWndMsg(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uiMsg)				// nach Nachrichtentyp unterscheiden
	{
		case WM_KEYDOWN:
		{
			switch(wParam)
			{
				case VK_ESCAPE:
				{					
					m_bRunning = false;
					break;
				}
			}

		}

	}	// ~switch(uiMsg);

	// wurde kein passender Nachrichtentyp gefunden, Nachricht an Windows weiterleiten	
	return DefWindowProc(hWnd, uiMsg, wParam, lParam);

}	// ~CWndEvents::ProcWndMsg();
</code></pre>
<p><strong>wndevents.h</strong></p>
<pre><code class="language-cpp">#include &lt;windows.h&gt; 

class CWndEvents
{ 
public: 

    // Gibt einen Zeiger auf das Objekt zurück
	inline	void* CWndEvents::GetEventClassPtr() { return this; }

	// Gibt den Ereignis-auslösenden Prozess zurück
	inline	WNDPROC GetStartWndProc() { return (WNDPROC)&amp;StartWndProc; }

protected: 
	// Die eigentliche Callback-Routine
    static	LRESULT CALLBACK StartWndProc(HWND, UINT, WPARAM, LPARAM);     

};
</code></pre>
<p><strong>wndevents.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;windows.h&gt; 
#include &quot;wndevents.h&quot; 

LRESULT CALLBACK CWndEvents::StartWndProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) 
{ 
	// Wird das Fenster angelegt, Pointer auf das Fenster merken
	if(uiMsg == WM_CREATE) 
	{ 
		SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)(((LPCREATESTRUCT)lParam)-&gt;lpCreateParams)); 
	} 

	// Pointer abfragen und Ergebnis weiterleiten
	CWndEvents *pWnd; 
	if(pWnd = (CWndEvents*)GetWindowLongPtr(hWnd, GWLP_USERDATA)) 
		return pWnd-&gt;ProcWndMsg(hWnd, uiMsg, wParam, lParam); 

	// Falls keine spezielle Behandlung, an Windows-Standard weiterleiten
	return DefWindowProc(hWnd, uiMsg, wParam, lParam); 

}	// ~CALLBACK CWndEvents::StartWndProc();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1249299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249299</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Tue, 20 Mar 2007 18:15:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 18:22:21 GMT]]></title><description><![CDATA[<p>OMG - vielleicht solltest du erstmal versuchen das mit meinem Code zu implementieren, du scheinst schwierigkeiten haben Code abzuschreiben und dabei was zu ändern.<br />
Kleiner Tipp: vergleiche mal den protected-Bereich von deinem Code in CWndEvents und den von meinem Code in CWndUnknown.... und außerdem: Specke deinen Code auf das WESENTLICHE ab bevor du ihn postest!!!! Ich habe keine lust mich durch dein InitD3d-Zeugs mich zu hängeln, was hierfür völlig uninteressant ist. Du bist ziemlich bequem.<br />
Dass du dir nicht einmal die mühe machst zu schauen, ob du überhaupt richtig abgeschrieben hast, tsss....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249304</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 18:22:21 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 18:29:44 GMT]]></title><description><![CDATA[<p>Außerdem: Wie soll ich wissen wenn du nur schreibst &quot;'ProcWndMsg': Ist kein Element von 'CWndEvents'&quot;, dass du CWndUnknown in CWndEvents umbenannt hast? das kommt bei dir ein posting später. Willst du Beiträge sammeln oder uns hier verarschen?<br />
Sry aber das regt mich grad ziemlich auf was du hier abziehst... man hilft dir, du verwendest den Code völlig falsch und machst dir nicht einmal die mühe, selbst EINMAL noch über deinen Code zu fliegen. So wirst du hier schnell keine freunde mehr haben, mir reichts nun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249312</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 18:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 18:31:48 GMT]]></title><description><![CDATA[<p>Entschuldige mal, du musst ja nicht gleich beleiddigend werden. Der Code ist bereits stark abgespeckt. In andern Sektionen dieses Forums hiess es eher das man mal etwas mehr zeigen soll um Zusammenhänge sehen zu können.</p>
<p>Ich habe bereits deine Variante ausprobiert und sie funktionierte (was ich auch bereits weiter oben beschrieben hatte). Nur wollte ich halt eine Variante wo ich direkt von CEngine auf die Routine zugreifen kann und nicht von der abgeleiteten Klasse. Aus diesem Grund habe ich diese auch nach CEngine verlegt, sonst wäre sie ja doppelt deklariert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249315</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Tue, 20 Mar 2007 18:31:48 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 18:36:30 GMT]]></title><description><![CDATA[<p>kokunze schrieb:</p>
<blockquote>
<p>Entschuldige mal, du musst ja nicht gleich beleiddigend werden.</p>
</blockquote>
<p>Gleich?</p>
<blockquote>
<p>Der Code ist bereits stark abgespeckt.</p>
</blockquote>
<p>lange nicht auf WESENTLICHE</p>
<blockquote>
<p>In andern Sektionen dieses Forums hiess es eher das man mal etwas mehr zeigen soll um Zusammenhänge sehen zu können.</p>
</blockquote>
<p>am besten du postest noch dein ganzes Projekt mit resource files, compiler-spezifische header files etc um die Zusammenhänge zu zeigen <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>
<blockquote>
<p>Ich habe bereits deine Variante ausprobiert und sie funktionierte (was ich auch bereits weiter oben beschrieben hatte).</p>
</blockquote>
<p>wo?</p>
<blockquote>
<p>Nur wollte ich halt eine Variante wo ich direkt von CEngine auf die Routine zugreifen kann und nicht von der abgeleiteten Klasse. Aus diesem Grund habe ich diese auch nach CEngine verlegt, sonst wäre sie ja doppelt deklariert.</p>
</blockquote>
<p>wie ich bereits sagte: lerne erst die basics und komm dann wieder. Informier dich am besten auch über das Wort &quot;virtual&quot;. Dann wirst du sehen dass du schwachfug postest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249317</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 18:36:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 18:48:03 GMT]]></title><description><![CDATA[<p>Hier:</p>
<p>kokunze schrieb:</p>
<blockquote>
<p>also hab das versucht, allerdings meldet er jetzt immer:</p>
<blockquote>
<p>'ProcWndMsg': Ist kein Element von 'CWndEvents'</p>
</blockquote>
<p>Wenn ich diese Methode mit als Mitglied von der Unknown Klasse mache geht es, allerdings kann ich dann nicht von dieser auf die Variablen von CEngine zugreifen.</p>
</blockquote>
<p>ich wollte lediglich ein wenig Hilfe wie ich das ganze so umschreiben kann, das ich von CEngine darauf zugreifen kann. Was du jetzt hier für Hasstiraden loslässt ist mir schleierhaft. Ich dachte das ist ein Forum zum gegenseitigen Helfen und nicht im sich zuzuflamen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249323</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Tue, 20 Mar 2007 18:48:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 19:04:36 GMT]]></title><description><![CDATA[<p>Worauf willst du von CEngine zugreifen? Deine Sätze ergeben keinen Sinn.<br />
Außerdem was soll das &quot;Hier&quot;? Du quotest dich selbst ohne Bezug.<br />
Und wo sagtest du, dass mein code funktioniert? diesen quote schuldest du mir immernoch.<br />
Natürlich kannst du aus ProcessWindowMessage auf die Variablen von CEngine zugreifen, dazu hast du es ja VIRTUAL deklariert <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 />
LRESULT CEngine::ProcessWindowMessage(blabla)<br />
{<br />
// blablablabla hier kannst du die message behandeln<br />
}<br />
Und wo du hasstiraden siehst ist mir - wie du sagtest - auch schleierhaft.<br />
Das war mein letzter post zu diesem Thema, cu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249328</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 19:04:36 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 19:07:20 GMT]]></title><description><![CDATA[<p>Ich quote mich von Seite 1:</p>
<pre><code class="language-cpp">LRESULT CEngine::ProcessWindowMessage(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uiMsg)                // nach Nachrichtentyp unterscheiden
    {
        case WM_KEYDOWN:
        {
            switch(wParam)
            {
                case VK_ESCAPE:
                {                   
                    DestroyWindow(hWnd);
                    break;
                }
            }

        }

    }    // ~switch(uiMsg);

    // wurde kein passender Nachrichtentyp gefunden, Nachricht an Windows weiterleiten
    return DefWindowProc(hWnd, uiMsg, wParam, lParam);
}
</code></pre>
<p>kannst du mir jetzt mal bitte erklären warum du nicht von CEngine auf .... was auch immer zugreifen kannst?????</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249329</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 19:07:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 19:24:34 GMT]]></title><description><![CDATA[<p>mit &quot;hier&quot; war gemeint das ich da bereits geschrieben hab, das es in besagter Variante läuft.</p>
<p><strong>&quot;Wenn ich diese Methode mit als Mitglied von der Unknown Klasse mache geht es, allerdings ...&quot;</strong></p>
<p>Ich hab es inzwischen hinbekommen durch überschreiben der Methode in der abgeleiteten Klasse. Problem ist allerdings das ich nun das Hauptprogramm nicht mehr kompilieren kann, weil besagtes ja in einer Klasse einer DLL war. Muss das nun also erstmal irgendwie umschreiben das der Starter weiß, das er die abgeleitete Klasse zum initialisieren aufrufen muss. Aber das ist ein anderer Schuh...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249346</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Tue, 20 Mar 2007 19:24:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Tue, 20 Mar 2007 20:00:51 GMT]]></title><description><![CDATA[<p>kokunze schrieb:</p>
<blockquote>
<p>mit &quot;hier&quot; war gemeint das ich da bereits geschrieben hab, das es in besagter Variante läuft.</p>
<p><strong>&quot;Wenn ich diese Methode mit als Mitglied von der Unknown Klasse mache geht es, allerdings ...&quot;</strong></p>
</blockquote>
<p>warum lässt du das allerdings weg?<br />
&quot;Wenn ich diese Methode mit als Mitglied von der Unknown Klasse mache geht es, allerdings kann ich dann nicht von dieser auf die Variablen von CEngine zugreifen.&quot;<br />
Genau das ist schlicht und einfach falsch, weshalb man daraus nicht ableiten kann das es geht. Vielmehr suggerierst du damit dass man es compilen kann (das heißt noch lange nicht dass es klappt), was du damit bekräftigst, dass du zuvor den compiler error aufführst, wenn du das nicht so machst.<br />
Nochmal: du kannst, wenn du es machst so wie ich es sage, auf Membervariablen und Memberfunktionen deiner Klasse zugreifen. Und wenn du das gegenteilige behauptest, scheint es doch nicht zu gehen, oder? <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>
<blockquote>
<p>Ich hab es inzwischen hinbekommen durch überschreiben der Methode in der abgeleiteten Klasse.</p>
</blockquote>
<p>was hast du nun im vergleich zu meinem code geändert? der funktioniert würdest du nicht alles ändern wollen ohne zu wissen was du da tust.</p>
<blockquote>
<p>Problem ist allerdings das ich nun das Hauptprogramm nicht mehr kompilieren kann, weil besagtes ja in einer Klasse einer DLL war. Muss das nun also erstmal irgendwie umschreiben das der Starter weiß, das er die abgeleitete Klasse zum initialisieren aufrufen muss. Aber das ist ein anderer Schuh...</p>
</blockquote>
<p>für mich redest du wirres zeugs.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249372</guid><dc:creator><![CDATA[Black Shadow]]></dc:creator><pubDate>Tue, 20 Mar 2007 20:00:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Wed, 21 Mar 2007 11:23:04 GMT]]></title><description><![CDATA[<p>Ich habe keine Lust weiter mit dir zu diskutieren, der geänderte Quelltext interessiert dich ja eh nicht und auf ein Niveau von Beleidigungen brauch ich mich nicht herablassen. Da das Hauptprogramm die veränderte DLL nicht mehr akzeptiert hat und dieses wieder zusätzlichen Aufwand erzeugt hätte, hab ich nun die Nase voll und eine einfachere Methode gefunden.</p>
<p>Alles beim alten wie ganz am Anfang der hreaderstellung und dann einfach die Methode static deklarieren und schon gibts keine Probleme mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249686</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Wed, 21 Mar 2007 11:23:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Wed, 21 Mar 2007 11:54:29 GMT]]></title><description><![CDATA[<p>kokunze schrieb:</p>
<blockquote>
<p>Alles beim alten wie ganz am Anfang der hreaderstellung und dann einfach die Methode static deklarieren und schon gibts keine Probleme mehr.</p>
</blockquote>
<p>Aber wie greifst Du dann auf die Membervariablen zu ? Das geht doch innerhalb einer statischen Methode nicht ?!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249712</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 21 Mar 2007 11:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Wed, 21 Mar 2007 16:22:08 GMT]]></title><description><![CDATA[<p>Ich brauch ja nur statische Variablen, es gibt eh nur genau eine Instanz der Klasse. Das müsste doch gehen?</p>
<p>Allerdings bekomm ich nun immer nen Linkerfehler:</p>
<blockquote>
<p>error LNK2001: Nicht aufgelöstes externes Symbol &quot;&quot;private: static bool CEngine::m_bRunning&quot; (?m_bRunning@CEngine@@0_NA)</p>
</blockquote>
<p><strong>Die Klasse:</strong></p>
<pre><code class="language-cpp">class __declspec(dllexport) CEngine
{
public:
...

private:

	// Callback Routine für Windows-Nachrichten
	static LRESULT CALLBACK WinEvents(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);

	static bool		m_bRunning;		// Gibt an, ob die Anwendung noch läuft

...

};	// ~class CEngine;
</code></pre>
<p><strong>Die Methode:</strong></p>
<pre><code class="language-cpp">LRESULT CALLBACK CEngine::WinEvents(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uiMsg)				// nach Nachrichtentyp unterscheiden
	{

 ...

		case WM_DESTROY:
		{
			m_bRunning = false;
			break;
		}

	}	// ~switch(uiMsg);

	// wurde kein passender Nachrichtentyp gefunden, Nachricht an Windows weiterleiten	
	return DefWindowProc(hWnd, uiMsg, wParam, lParam);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1249916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249916</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Wed, 21 Mar 2007 16:22:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wie die Callback Routine in Klasse integrieren? on Wed, 21 Mar 2007 16:27:08 GMT]]></title><description><![CDATA[<p>Ach ich habs grad selber, hab die Definition vergessen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1249918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1249918</guid><dc:creator><![CDATA[kokunze]]></dc:creator><pubDate>Wed, 21 Mar 2007 16:27:08 GMT</pubDate></item></channel></rss>