Wenn ich virtuelle Methode aufrufe kracht es



  • erinnert mich irgendwie an eine Klasse, die ich mal im winapi teil gepostet hab:

    class SubClass{
        private:
            static long BaseWindowProc(HWND hwnd,unsigned int message,unsigned int wParam,unsigned int lParam){
                callback oldCallback=reinterpret_cast<callback>(GetProp(hwnd,"oldCallback"));
    
                SubClass* callingClass=reinterpret_cast<SubClass*>(GetProp(hwnd,"this"));
                return callingClass->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("couldn't create subclass->Nullpointer",__LINE__,__FILE__));
                }
                //get old callback
                oldCallback=reinterpret_cast<callback>(GetWindowLongPtr(subWindow,GWLP_WNDPROC));
    
                //set properties
                SetProp(subWindow,"oldCallback",oldCallback);
                SetProp(subWindow,"this",this);
    
                //set new callback
                SetWindowLongPtr(subWindow,GWLP_WNDPROC,reinterpret_cast<long>(BaseWindowProc));
            }
            virtual ~SubClass(){
                //reset window
                SetWindowLongPtr(subWindow,GWLP_WNDPROC,reinterpret_cast<long>(oldCallback));
                RemoveProp(subWindow,"oldCallback");
                RemoveProp(subWindow,"this");
            }
            HWND getHandle(){
                return subWindow;
            }
        };
    

    nachteil deiner Klasse: sie kann die funktionalität eines buttons(zb) nicht erhalten.
    Das Klassendesign hab ich aber dann verworfen,da es einige probleme damit gab, zb, dass man in teufelsküche kam,wenn man versuchte eine subclass mit dem von Gethandle gelieferten HWND zu erstellen. Die Designschwäche war stark genug, dass ich mich davon wieder abgewandt hab(auch wenn es möglich wäre,das design zu korrigieren,es lohnt nicht, der aufwand wird viel zu groß,und das ganze endet in lustigen undurchsichtigen rekursionen)



  • Danke für eure Antworten.
    Ich werd mal einiges probieren.


Anmelden zum Antworten