<?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 beim Setzen einer WNDPROC ( mit Klassen )]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich versuche gerade mi Hilfe von Klassen ein paar Fenster zu managen, aber es gibt da ein Problem. Und zwar bekomme ich, wenn ich mit SetWindowLong die WndProc für das Fenster setzen will, immer diese Fehlermeldung:</p>
<pre><code>error: aggregate value used where an integer was expected
</code></pre>
<p>Ich habe keine Ahnung, was mir MinGW damit sagen will.<br />
Und hier der Code dazu. Wäre echt super, wenn mir jemand weiterhelfen könnte.</p>
<pre><code class="language-cpp">class CBase
{
	public:
		HWND hwnd;

		virtual LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam );

};

class CWindow : public CBase
{
	public:
		LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
		{
			return DefWindowProc( hwnd, msg, wparam, lparam );
		}

};

CBase* window = new CWindow;
SetWindowLong( hwnd, GWL_WNDPROC, (LONG)window-&gt;WndProc );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/195339/problem-beim-setzen-einer-wndproc-mit-klassen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 30 Jun 2026 00:58:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195339.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Oct 2007 18:02:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem beim Setzen einer WNDPROC ( mit Klassen ) on Tue, 16 Oct 2007 18:02:39 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich versuche gerade mi Hilfe von Klassen ein paar Fenster zu managen, aber es gibt da ein Problem. Und zwar bekomme ich, wenn ich mit SetWindowLong die WndProc für das Fenster setzen will, immer diese Fehlermeldung:</p>
<pre><code>error: aggregate value used where an integer was expected
</code></pre>
<p>Ich habe keine Ahnung, was mir MinGW damit sagen will.<br />
Und hier der Code dazu. Wäre echt super, wenn mir jemand weiterhelfen könnte.</p>
<pre><code class="language-cpp">class CBase
{
	public:
		HWND hwnd;

		virtual LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam );

};

class CWindow : public CBase
{
	public:
		LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
		{
			return DefWindowProc( hwnd, msg, wparam, lparam );
		}

};

CBase* window = new CWindow;
SetWindowLong( hwnd, GWL_WNDPROC, (LONG)window-&gt;WndProc );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1386610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386610</guid><dc:creator><![CDATA[Verzweifelt++]]></dc:creator><pubDate>Tue, 16 Oct 2007 18:02:39 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Setzen einer WNDPROC ( mit Klassen ) on Tue, 16 Oct 2007 18:54:53 GMT]]></title><description><![CDATA[<p>Du kannst keine nicht statische Memberfunktion in dieser Form als Callback verwenden.<br />
<a href="http://www.mpdvc.de/html.htm#Q18" rel="nofollow">http://www.mpdvc.de/html.htm#Q18</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1386662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1386662</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 16 Oct 2007 18:54:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Setzen einer WNDPROC ( mit Klassen ) on Wed, 17 Oct 2007 11:23:05 GMT]]></title><description><![CDATA[<p>Ah, dankeschön!</p>
<p>Ich verstehe aber noch nicht ganz, wie ich das Problem jetzt lösen soll. Bei einer WndProc werden doch alle Parameter benötigt, also kann ich keinen so verwenden, wie es auf der Website beschrieben ist.</p>
<p>Das Problem ist ja, dass ich in CWindow Daten speichern möchte, die ich abrufen kann, wenn das Fenster zum Beispiel bewegt wird. Dann wird das Window handle an die Callback-Funktion weitergegeben, aber ich bräuchte einen Zeiger auf die Instanz von CWindow, in der sich das HWND befindet.</p>
<p>Geht das? Und wenn ja, wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1387079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1387079</guid><dc:creator><![CDATA[Verzweifelt++]]></dc:creator><pubDate>Wed, 17 Oct 2007 11:23:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Setzen einer WNDPROC ( mit Klassen ) on Wed, 17 Oct 2007 12:00:06 GMT]]></title><description><![CDATA[<p>ne möglichkeit wäre doch</p>
<p>auserhalb der Classe in der header</p>
<blockquote>
<p>class CWindow : public CBase<br />
{<br />
void SetVar(int, int);<br />
};<br />
extern CWindow m_Window;</p>
</blockquote>
<p>in der cpp</p>
<pre><code>CWindow m_Window;

LRESULT CALLBACK WindowProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam );

LRESULT CALLBACK WindowProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
{
       switch(msg)
       {
        case WM_.....:
           m_Window.SetVar(1, 1);
        break;
       }
       return DefWindowProc( hwnd, msg, wparam, lparam );
}
</code></pre>
<p>und starten tust du ja die Callbackprocedur entweder über CreateDialog oder bei CreateWindow(Ex) über RegisterClass.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1387126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1387126</guid><dc:creator><![CDATA[*rT*f*Ct]]></dc:creator><pubDate>Wed, 17 Oct 2007 12:00:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Setzen einer WNDPROC ( mit Klassen ) on Wed, 17 Oct 2007 17:29:38 GMT]]></title><description><![CDATA[<p>Dann musst Du entweder die Informationen in den Windows Daten mit speichern und kannst diese Info mit Set/GetWindowLong(Ptr) nutzen.<br />
Oder Du verwendest z.B. Set/GetProp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1387367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1387367</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 17 Oct 2007 17:29:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Setzen einer WNDPROC ( mit Klassen ) on Wed, 17 Oct 2007 18:24:04 GMT]]></title><description><![CDATA[<p>Hmm bin gerade nen kleines Projekt bei <a href="http://sourceforge.net" rel="nofollow">sourceforge.net</a> dazu am erstellen, weil es dauert Anfänger fragen ... ist eigentlich ganz einfach ...<br />
Du legst eine statische WindowProc für deine Fensterklasse an. Dann reagierst du darauf, ob ein WM_NCCREATE kommt. Da kannst du die Extra-Daten, die du bei CreateWindowEx angeben kannst, auswerten. (WM_CREATE würde auch gehen ... ist unter umständen aber zu spät.) Dann packst du die Extra-Daten per SetWindowLongPtr als GWL_USERDATA. Jetzt kannst du dir immer die Extra-Daten innerhalb der statischen MessageProc per GetWindowLongPtr holen. Als Extra-Daten gibst du halt einfach einen this-Zeiger an! Und schon ist das Problem gelöst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":-P"
      alt="😛"
    /><br />
=&gt;</p>
<pre><code class="language-cpp">LRESULT CALLBACK Window::__message_proc(::HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
	{
		Window* pWindow = Window::FromHandle(hWnd);
#pragma warning(disable: 4311)
		if (message == WM_NCCREATE)
		{
			pWindow = reinterpret_cast&lt;Window*&gt;(reinterpret_cast&lt;::LPCREATESTRUCT&gt;(lParam)-&gt;lpCreateParams);
			SetWindowLongPtr(hWnd, GWL_USERDATA, reinterpret_cast&lt;LONG&gt;(pWindow));
		}
#pragma warning(default: 4311)
		return (pWindow != NULL ? pWindow-&gt;_message_proc(hWnd, message, wParam, lParam) : ::DefWindowProc(hWnd, message, wParam, lParam));
	}
</code></pre>
<p>...</p>
<pre><code class="language-cpp">public:
		operator ::HWND() const		{	return m_hWnd;	}
#pragma warning(disable: 4312)
		static Window* FromHandle(const ::HWND&amp; hWnd) { return reinterpret_cast&lt;Window*&gt;(GetWindowLongPtr(hWnd, GWL_USERDATA)); };
#pragma warning(default: 4312)
</code></pre>
<p>... _message_proc ist dann die MessageProc (idealerweise virtual ...) in deiner Klasse die NICHT statisch ist.</p>
<pre><code class="language-cpp">public:
		virtual LRESULT			_message_proc(::HWND, UINT, WPARAM, LPARAM);

	private:
		static LRESULT CALLBACK	__message_proc(::HWND, UINT, WPARAM, LPARAM);

	public:
		const ::HWND&amp;			get_handle() const						{ if (m_hWnd == NULL || ::IsWindow(m_hWnd) == FALSE) throw std::invalid_argument(&quot;window handle does not exist&quot;); return m_hWnd; }
</code></pre>
<p>...<br />
oder du wartest halt bis ich das Projekt fertig hab (muss nurnoch die einzellnen Messages (LB_GETITEMDATA usw.) in Funktionen packen und das halt auch mit den entsprechenden Controls ... sonnst bin ich fertig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /> Mit vollständiger Dokumentation ^^ Mir liegt das Wohl der Anfänger halt am Herzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1387390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1387390</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 17 Oct 2007 18:24:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem beim Setzen einer WNDPROC ( mit Klassen ) on Thu, 18 Oct 2007 10:16:38 GMT]]></title><description><![CDATA[<p>Hey danke, (D)Evil! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Ich wusste gar nicht, dass man Userdaten angeben kann. So werde ich es machen.<br />
Vielen, vielen Dank!</p>
<p>PS: Wie wird das Projekt heißen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1387757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1387757</guid><dc:creator><![CDATA[Nicht-mehr-Verzweifelt++]]></dc:creator><pubDate>Thu, 18 Oct 2007 10:16:38 GMT</pubDate></item></channel></rss>