<?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[WindowProc in subclass-&amp;gt; so gut gelöst?]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39356&amp;postdays=0&amp;postorder=asc&amp;start=30" rel="nofollow">in der Faq</a> wurde einmal diskutiert,wie man ein windowproc als methode aus einer klasse benutzen kann, ich hab mal drüber nachgedacht, und kam auf folgende lösung für subclasses:</p>
<pre><code class="language-cpp">class SubClass{
    private:
        static long BaseWindowProc(HWND hwnd,unsigned int message,unsigned int wParam,unsigned int lParam){
            callback oldCallback=reinterpret_cast&lt;callback&gt;(GetProp(hwnd,&quot;oldCallback&quot;));

            SubClass* callingClass=reinterpret_cast&lt;SubClass*&gt;(GetProp(hwnd,&quot;this&quot;));
            return callingClass-&gt;WindowProc(oldCallback,hwnd,message,wParam,lParam);
        }
        HWND subWindow;
        callback oldCallback;
    protected:
        virtual long WindowProc(callback oldCallback,HWND hwnd,unsigned int message,unsigned int wParam,long lParam)=0;
    public:
        SubClass(HWND window):subWindow(window){
            if(!window){
                throw(Exception::CreationFailed(&quot;couldn't create subclass-&gt;Nullpointer&quot;,__LINE__,__FILE__));
            }
            //get old callback
            oldCallback=reinterpret_cast&lt;callback&gt;(GetWindowLongPtr(subWindow,GWLP_WNDPROC));

            //set properties
            SetProp(subWindow,&quot;oldCallback&quot;,oldCallback);
            SetProp(subWindow,&quot;this&quot;,this);

            //set new callback
            SetWindowLongPtr(subWindow,GWLP_WNDPROC,reinterpret_cast&lt;long&gt;(BaseWindowProc));
        }
        virtual ~SubClass(){
            //reset window
            SetWindowLongPtr(subWindow,GWLP_WNDPROC,reinterpret_cast&lt;long&gt;(oldCallback));
            RemoveProp(subWindow,&quot;oldCallback&quot;);
            RemoveProp(subWindow,&quot;this&quot;);
        }
        HWND getHandle(){
            return subWindow;
        }
    };
</code></pre>
<p>die klasse kann einfach abgeleitet werden, und die derived class kann dann die windowproc als normale methode stellen.</p>
<p>ist die lösung so richtig,bzw gut? oder fehlt noch was?habt ihr das vielleicht anders/besser gelöst?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/82718/windowproc-in-subclass-gt-so-gut-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 08:28:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/82718.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Aug 2004 11:45:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Fri, 13 Aug 2004 11:46:14 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39356&amp;postdays=0&amp;postorder=asc&amp;start=30" rel="nofollow">in der Faq</a> wurde einmal diskutiert,wie man ein windowproc als methode aus einer klasse benutzen kann, ich hab mal drüber nachgedacht, und kam auf folgende lösung für subclasses:</p>
<pre><code class="language-cpp">class SubClass{
    private:
        static long BaseWindowProc(HWND hwnd,unsigned int message,unsigned int wParam,unsigned int lParam){
            callback oldCallback=reinterpret_cast&lt;callback&gt;(GetProp(hwnd,&quot;oldCallback&quot;));

            SubClass* callingClass=reinterpret_cast&lt;SubClass*&gt;(GetProp(hwnd,&quot;this&quot;));
            return callingClass-&gt;WindowProc(oldCallback,hwnd,message,wParam,lParam);
        }
        HWND subWindow;
        callback oldCallback;
    protected:
        virtual long WindowProc(callback oldCallback,HWND hwnd,unsigned int message,unsigned int wParam,long lParam)=0;
    public:
        SubClass(HWND window):subWindow(window){
            if(!window){
                throw(Exception::CreationFailed(&quot;couldn't create subclass-&gt;Nullpointer&quot;,__LINE__,__FILE__));
            }
            //get old callback
            oldCallback=reinterpret_cast&lt;callback&gt;(GetWindowLongPtr(subWindow,GWLP_WNDPROC));

            //set properties
            SetProp(subWindow,&quot;oldCallback&quot;,oldCallback);
            SetProp(subWindow,&quot;this&quot;,this);

            //set new callback
            SetWindowLongPtr(subWindow,GWLP_WNDPROC,reinterpret_cast&lt;long&gt;(BaseWindowProc));
        }
        virtual ~SubClass(){
            //reset window
            SetWindowLongPtr(subWindow,GWLP_WNDPROC,reinterpret_cast&lt;long&gt;(oldCallback));
            RemoveProp(subWindow,&quot;oldCallback&quot;);
            RemoveProp(subWindow,&quot;this&quot;);
        }
        HWND getHandle(){
            return subWindow;
        }
    };
</code></pre>
<p>die klasse kann einfach abgeleitet werden, und die derived class kann dann die windowproc als normale methode stellen.</p>
<p>ist die lösung so richtig,bzw gut? oder fehlt noch was?habt ihr das vielleicht anders/besser gelöst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/581917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/581917</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Fri, 13 Aug 2004 11:46:14 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 06:06:53 GMT]]></title><description><![CDATA[<p>*snief* niemand eine meinung dazu?*mitleidereg**künstlichheul*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582458</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 14 Aug 2004 06:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 18:53:13 GMT]]></title><description><![CDATA[<p>Ich kann dir nicht sagen ob deine Lösung gut oder schlecht ist. Ich würde dir aber dazu raten lieber ein gutes Framework zu verwenden anstatt eine eigene Lösung zu erarbeiten, die dich in Zukunft bestimmt noch sehr viel Zeit und Mühe kosten wird. Ich habe selber vor zwei Monaten versucht eine Klasse zu schreiben, die für mich ein Window Handle kapseln sollte und von der auch das Ableiten möglich sein sollte. Es funktionierte im Großen und Ganzen irgendwie (war sicherlich noch fehleranfällig), aber den Aufwand den ich trieb fand ich schon ziemlich erschreckend groß. Ich gab den ganzen Kram aufgegeben als ich das erste mal von wxWidgets hörte, wovon ich sehr begeistert war. Es ist ganz einfach ein brauchbares (cross-platform) Framework und das beste ist, es lässt plattformspezifischen Code zu, somit sind die Erfahrungen die du mit der WinAPI gemacht hast nicht gänzlich unnötig.</p>
<p>Weitere Informationen findest du unter: <a href="http://www.wxwidgets.org" rel="nofollow">www.wxwidgets.org</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/582710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582710</guid><dc:creator><![CDATA[Aziz]]></dc:creator><pubDate>Sat, 14 Aug 2004 18:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 15:23:05 GMT]]></title><description><![CDATA[<p>otze, ich würde ne Klasse Window programmieren, die eine Methode subclass hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582713</guid><dc:creator><![CDATA[würder]]></dc:creator><pubDate>Sat, 14 Aug 2004 15:23:05 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 16:18:59 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5360">@Aziz</a>: da ich später eh eine GUI komplett selber programmieren muss(für opengl/dx),kann ich jede erfahrung die ich mit der WinAPI jetzt heir sammle fast 1:1 übernehmen, deshalb zieh ich das hier jetzt bis zum ende durch^^</p>
<p>@würder: sicher, aber die methode währe niemals so konfortabel wie eine vererbung,vorallem wegen des verfügbaren this zeigers und des direktzugriffs auf die private elemente der Klasse.Dies ist sozusagen ein statisches subclassing,gedacht für das monitoring von standard kontrollelementen wie buttons.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582761</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 14 Aug 2004 16:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 16:33:19 GMT]]></title><description><![CDATA[<p>so wie ich mir das dachte hätte man this zeigers und des direktzugriffs auf die private elemente.</p>
<pre><code class="language-cpp">HWND buttonHandle = CreateWindowEx(....);

Button button;
button.subclass(buttonHandle);
</code></pre>
<p>So hab ich das in meiner Fensterklasse gemacht.<br />
Nach dem Aufruf von subclass wird immer erst die Button::WndProc ausgeführt und dann am Schluß die alte Callback.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582762</guid><dc:creator><![CDATA[würder]]></dc:creator><pubDate>Sat, 14 Aug 2004 16:33:19 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 19:16:04 GMT]]></title><description><![CDATA[<p>naja^^<br />
das was du kannst schaff ich auch:</p>
<pre><code class="language-cpp">class Button:public SubClass{
    private:
        long WindowProc(callback oldCallback,HWND hwnd,unsigned int message,unsigned int wParam,long lParam){
            oldCallback(hwnd,message,wParam,lParam);
        }    
    public:
        Button(HWND hwnd):SubClass(hwnd){}
};
</code></pre>
<pre><code class="language-cpp">HWND buttonHandle = CreateWindowEx(....);

Button button(buttonHandle);
</code></pre>
<p>wo liegt nun der vorteil deiner version? <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="😃"
    /><br />
ps:<br />
wenn ich den ctor von subclass als einfache funktion nochmal implementiere kann ich genau dasselbe erreichen wie du mit deiner methode <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>
<p>aber nur aus interesse:wie hast dus denn implementiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582827</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 14 Aug 2004 19:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 19:26:19 GMT]]></title><description><![CDATA[<p>Ein Button ist ein Fenster, Punkt. Nix subclass, nix Spaghetti, sondern Fenster. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /> <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/582836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582836</guid><dc:creator><![CDATA[Shlo]]></dc:creator><pubDate>Sat, 14 Aug 2004 19:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 19:32:32 GMT]]></title><description><![CDATA[<p>und was ist, wenn das teil kein fenster ist, sondern nur ein fenster überwacht? was is es dann?^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582838</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 14 Aug 2004 19:32:32 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 19:32:42 GMT]]></title><description><![CDATA[<p>Otze der Klassenname SubClass ist sehr schlecht.<br />
Da weiß überhaupt niemand was gemeint ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582839</guid><dc:creator><![CDATA[oma]]></dc:creator><pubDate>Sat, 14 Aug 2004 19:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to WindowProc in subclass-&amp;gt; so gut gelöst? on Sat, 14 Aug 2004 19:37:22 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>und was ist, wenn das teil kein fenster ist, sondern nur ein fenster überwacht? was is es dann?^^</p>
</blockquote>
<p>Was soll da überwacht werden? <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="😕"
    /> Wenn irgendwas subclassed wird, dann kann es nur ein Fenster sein. Bei Hooks wird diese Methode eh nicht funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/582842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/582842</guid><dc:creator><![CDATA[Shlo]]></dc:creator><pubDate>Sat, 14 Aug 2004 19:37:22 GMT</pubDate></item></channel></rss>