Klasse in der Fenster erzeugt wird



  • Kann man eigendlich eine Klasse schreiben, in der ein Fenster erzeugt wird (also die WinMain ausgeführt wird)?? Ich müsste ja die Nachrichtenfunktion irgendwie noch angeben. Findet das Betriebssystem denn dann die Main noch? würd mich echt über antworten freuen.

    Also nochmal damit ihr wisst was ich will: normalerweise wird die WinMain und die CALLBACK ja als Funktion aufgerufen. Ich will jetzt diese in einer Klasse aufrufen. Eventuell auch über ein Interface (abstrkate Klasse) vererben....



  • HI

    Also das mit der WinMain in eine Klasse is wohl Blödsinn, wie soll das denn passieren?? Wie willst du ein Programm starten, dass keine Mainfunktion hatt?
    Einen Startpunkt braucht dein Progamm nunmal. (und in dem Fall auch eine Endlosschleife).
    Außer hättest du auch nix davon wenn die WinMain in ner KLasse wär.

    Was die Winproc angeht, schau mal in den FAQ und ein Thema kurz weiter unten (Winproc in Klasse).

    Grüße Flow



  • Ich habe jetzt noch ein anderes Problem bekommen.... die Nachrichtenfunktion muss ja static sein (wegen dem this-zeiger). Nun muss ich aber die Nachrichtenfunktion von einer abstrakten Klasse erben, also ist diese schon virtual. Und beides zusammen geht ja nicht was mach ich denn nun?!



  • Original erstellt von Parapiler:
    Nun muss ich aber die Nachrichtenfunktion von einer abstrakten Klasse erben, also ist diese schon virtual.

    Also irgendwie gehst du das problem komplizierter an als es ist...
    Kleiner Denkanstoß:
    Lass die WndProc global mit dem Inhal:

    LRESULT CALLBACK MainProc(HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam)
    {
      return myClass->myProc(hWnd,message,wParam,lParam);
    }
    

    Im constructor deiner MainWin-class setzt du nun den myClass pointer und der Laden hat sich.. dann kann myProc virtual, oder static oder was weis ich was sein..
    Wenn du nicht nur ein MainWin hast sondern was bauen willst, was z.B. einfach nur nen Dialog kapselt, empfieht sich die Methode die MFC & co. anwenden. Deine abgeleitete Klasse teilt der Basisklasse mit welche Funktionen sie neu definiert und Basiklass reicht dann das ganze Zeug einfach weiter..

    [ Dieser Beitrag wurde am 10.05.2003 um 14:05 Uhr von CMatt editiert. ]



  • ich habe mir das nun zusammengebastelt nur irgendwie funktioniert das nicht vielleicht sagt mir einer mal warum. Ich habe eine abstrakte Klasse und jedes Fenster muss seine Fensterklasse von ihm ableiten. Das Interface hat im moment eine minimale funktionalität, wird noch erweitert, aber für das Fenster sollte es genügen. Die Fensterklasse überschreibt die Callback sowie die Fenstermethode CreateMainWindow ().

    hier der code

    class IWindow
    {
        public:
            virtual HWND CreateMainWindow () = 0;
            virtual LRESULT CALLBACK MessageHandler (HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam) = 0;
            virtual void MessageLoop ();
    
            HWND gethWindow ();
            HINSTANCE gethInstance ();
            WNDCLASSEX getdaWindow ();
            MSG getMessage ();
            bool getrun ();
    
        private:
    
        protected:
            HWND hWindow;
            HINSTANCE hGlobInstance;
            WNDCLASSEX daWindow;
            MSG message;
            bool isrun;
    };
    
    class COutput : public IWindow 
    {
        public:
    
            COutput (void* object, int x, int y, int* color);
            ~COutput ();
            CUser* getdata ();      
            int getx ();
            int gety ();
            int* getcolor ();
            virtual HWND CreateMainWindow () ;
            virtual LRESULT CALLBACK MessageHandler (HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam);
            static  LRESULT CALLBACK MessageProxy (HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam);
    
            void wwrite ();
    
        private:
    
            CUser* data;
            int x;
            int y;
            int* color;
    
        protected:
    };
    
    HWND COutput::CreateMainWindow ()
    {
        //set the windowstructur to zero
        memset (&daWindow, 0, sizeof (WNDCLASSEX));
    
        daWindow.cbClsExtra = 0;
        daWindow.cbSize = sizeof (WNDCLASSEX);
        daWindow.cbWndExtra = 0;
        daWindow.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
        daWindow.hCursor = LoadCursor (hGlobInstance, IDC_ARROW);
        daWindow.hIcon = LoadIcon (hGlobInstance, IDI_APPLICATION);
        daWindow.hIconSm = LoadIcon (hGlobInstance, IDI_APPLICATION);
        daWindow.hInstance = hGlobInstance;
        daWindow.lpfnWndProc = MessageProxy;
        daWindow.lpszClassName = "UML";
        daWindow.lpszMenuName = NULL;
        daWindow.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
    
        //create window and retrive the window
        return hWindow = CreateWindowEx (NULL,
                                        "UML",
                                        "Dies hier ist ein Spassprogramm, ich habe ja soviel langeweile und will UML lernen",
                                        WS_OVERLAPPEDWINDOW,
                                        200, 200,
                                        250,300,
                                        NULL,
                                        (HMENU) NULL,
                                        hGlobInstance, 
                                        this);
    
    }
    
    LRESULT CALLBACK COutput::MessageHandler (HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
    
            case WM_DESTROY:
                PostQuitMessage (0);
                isrun = false;
                return 0;
            case WM_QUIT:
                PostQuitMessage (0);
                isrun = false;
                return 0;
            case WM_CLOSE:
                PostQuitMessage (0);
                isrun = false;
                return 0;
            case WM_LBUTTONDOWN:
                break;
            case WM_COMMAND:
                switch (LOWORD (wParam))
                {
    
                }
                break;
    
            default: 
                return DefWindowProc (hWindow, message, wParam, lParam);
        }
    
    }
    
    LRESULT CALLBACK COutput::MessageProxy (HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
        if (message == WM_CREATE)
        {
            COutput *window = (COutput*) (((LPCREATESTRUCT) lParam)->lpCreateParams);
            SetWindowLong(hWindow, GWL_USERDATA, (long) window);  
        }
    
        COutput* ww  = (COutput*) GetWindowLong (hWindow, GWL_USERDATA);
    
        return ww->MessageHandler (hWindow, message, wParam, lParam);
    
    }
    

    das ganze wird so aufgerufen:

    int APIENTRY WinMain (HINSTANCE hInstance, 
                          HINSTANCE hPrevInstance, 
                          LPSTR lpCmdLine,
                          int nShowCmd)
    
    {
    
        //pointer to the Data-object
        void* pointer = NULL;
        //here the Data- Object is created
        CUser daUser ("Schabbach" , "Sebastian", "Altes Stadion", "Grevenbroich", "10941" , "02182", 27, 41416);
        //the pointer to the data- Object have to be show at the object
        pointer = (CUser*) &daUser;
        //the color of the output have to be set here
        //first at all allocisize memory
        int* col = new int [3];
        //here the color is set
        col[0] = 20;  //first value
        col[1] = 180; //second value
        col[2] = 128; //third value
    
        //load Windowobject into memory 
        COutput out (&pointer, 20, 20, col);
    
        //create a window
        out.CreateMainWindow ();
    
        return 0;
    
    }
    


  • MessageLoop, ist das nur schönheit da, oder wird das auch irgendwo aufgerüfen? Sonst hast schon mal nen Grund warums nicht geht.. 😉 :p



  • ja die wird nun aufgerufen, genauso wie ShowWindow und UpdateWindow und natürlich auch RegisterClassEx LÖL hatt ich alles vergessen....

    aber bei return ww->............ (beim Rückgabewert der MessageProxy) wird einen exception ausgelöst



  • Ich habe mal weiter debuggt und die Schleife wird übersprungen also messaage != WM_CREATE.... das muss ich nicht verstehen oder?



  • keine antwort mehr?!



  • nein


Log in to reply