CWnd::SubclassWindow() Wie wird CWnd::Create() aufgerufen?



  • Gibt es im www irgendwo ein passendes Beispiel (source) wie man subclassing realisiert, bzw. mit welchen Parametern man ein Objekt dieser Klasse erzeugt ?

    Bei letzterem weiss ich leider nicht so recht wie es gemacht werden sollte. Create() aufrufen oder an entsprechender Stelle eine Create-Nachricht schicken?

    Wenn jemand ein passendes Codeschnippsel auf dem Rechner liegen hat und dieses hier posten könnte wäre ich sehr dankbar.

    Grüße


  • Mod

    Alles in der MFC geschieht über Subclassing. Ein Objekt wird angelegtund mit DDX_Control (welches SubclassWindow benutzt) wird an das Objekt das bestehnde Fenser gebunden.

    Wenn Du einen ASSERT an dieser Stelle bekommst, dann ist diesem Fensterobjekt bereits ein Fenster zugeordnet (m_hWnd ist nicht mehr NULL).
    Das prüft der ASSERT.

    Win CWnd Objekt ist nur eine Hülle um ein HWND Handle. Ein CWnd Objekt kann nur einmal einem Fenster zugerodnet werden, oder erzuget werden.

    Beim erzeugen wird in Create das Handle durch die Windows API belegt. Wenn Du einen Subclass machst wird ein bestehendes Handle einem leeren Objekt zugeordnet.
    Gleichfalls kann man auch ein Windows Handle nicht mehreren Objekten zurodnen...



  • Hallo Martin,

    vielen Dank für deine Hilfe !! Ohne wäre ich echt aufgeschmissen (Das ganze ist für eine wichtige Arbeit und der Abgabetermin ist die kommende Woche 😞 - bis dahin muss ich das ganze irgendwie laufen zum laufen bekommen 😮 ).

    Ich hab das ganze nochmal probiert und bekomme nun:
    Unhandled exception in meiner Anwendung: 0xC00000FD: Stack Overflow.

    Diese tritt an folgender Stelle auf:

    // wincore.cpp/////////////////////
    
    CWnd* PASCAL CWnd::FromHandlePermanent(HWND hWnd)
    {
    	// ***** an dieser Stelle tritt der Fehler auf *****	
    
    	CHandleMap* pMap = afxMapHWND();
    	CWnd* pWnd = NULL;
    	if(pMap != NULL)
    	{	
    		// only look in the permanent map - does no allocations
    		pWnd = (CWnd*)pMap->LookupPermanent(hWnd);
    		ASSERT(pWnd == NULL || pWnd->m_hWnd == hWnd);
    	}
    	return pWnd;
    }
    

    Mir ist leider nicht klar, was ich falsch mache bzw. wo der Fehler liegt ?



  • 💡 ...dauert manchmal etwas länger. D. h. das Fenster wurde schon ge-subclassed 🙂 . Wie komme ich nun an dieses dem Fenster zugeordnete CWnd Objekt?


  • Mod

    Dann musst Du doch ach ds Objekt schon haben...
    Wer hat das denn gesubclassed?

    Ansonsten CWnd::FromHandle!



  • Hab nochmal ein bisschen gegoogelt, durch:

    CWnd *pWnd = CWnd::FromHandle((HWND) cvGetWindowHandle(name));
    

    würde ich einen Zeiger auf dieses Fenster erhalten (wenn ich das richtig verstanden habe).

    Wie oder Wo finde ich jetzt die Message Handler zu diesem Fensterobjekt, bzw. überhaupt erstmal dieses Fensterobjekt?


  • Mod

    Du stellst Fragen!
    Bei demjenigen, der dieses Fenser gesubclassed hat. Das muss doch jemand gemacht haben... Das passiert doch nicht einfach so...



  • Sorry,

    ich habe aber leider keinen richtigen Durchblick bei der ganzen Sache.

    Kannst du bitte mal ein minimales Beispiel hier rein stellen. Welche Funktionen ich benötige bzw. wie ich das Fenster aus meinem Dialog heraus erzeugen kann.

    Ich komme hier irgendwie absolut nicht weiter.



  • Durch meinen Aufruf von

    Vwindow.Create (NULL,
                    pApp->Data.getName(),
                    WS_BORDER | WS_VISIBLE,
                    CRect(0,0,
                          cvGetCaptureProperty(pApp->Data.getCaptureVideo(),    
                                                        CV_CAP_PROP_FRAME_WIDTH)), 
                          cvGetCaptureProperty(pApp->Data.getCaptureVideo(),    
                                                        CV_CAP_PROP_FRAME_WIDTH)),
                          this,
                          1234
                    );
    

    will ich das Fenster doch erst subclassen. Aber es scheint schon gesubclassed zu sein ????



  • Das entwickelt sich langsam zum Monolog 😃 . Das Fenster existiert doch schon...ist der aufruf von Create() mit den ganzen Parametern (s.o.) überhaupt richtig um das Fenster zu erzeugen?


  • Mod

    Dann ist VWindow doch das Objekt Deiner wahl und irgendwo ist Vwindow definiert und ene Message-Map drin.


Anmelden zum Antworten