virtual subclass not called



  • Hi,

    ich hab eine Window-Class CTimerWnd erstellt, in der ein Timer gesetzt worden ist, so dass OnTimer ständig aufgerufen wird. CTimedDocument ist meine Documenten-Class.

    class CTimerWnd : public CWnd
    {
    
    protected:
        CTimedDocument * doc;
       //{{AFX_MSG(CTimerWnd)
       afx_msg void OnTimer(UINT nIDEvent);
    }; 
    
    void CTimerWnd::OnTimer(UINT nIDEvent) 
    {
     if(doc != NULL)
            doc->OnTimerFunc();    //error  
    
     CWnd::OnTimer(nIDEvent);
    }
    

    Im OnTimer möchte ich gern eine Funktion die virtual in der CTimedDocument Class definiert ist aufrufen, leider ohne Erfolg (das ASSERT wird ständig ausgeführt).

    Die Subclass von CTimedDocument wird never called (auch nicht deren Constructor). Benötige ich für das in der CTimedDocument Class irgendeinen Member?

    class CTimedDocument :public CDocument
    {
    
    protected:
       virtual void OnTimerFunc() { /*ASSERT(FALSE);*/ }  // implement in subclass
    };
    
    class CDmxTimeDoc : public CTimedDocument
    {
    protected:
         virtual void OnTimerFunc();  
    };
    

    Das Window CTimerWnd wird zu Beginn (bzw. während der Laufzeit) erstellt mit; eine View gibt es nicht dazu und das Window selbst soll auch unsichtbar sein.

    BOOL CTimerWnd::Start(UINT ms, CTimedDocument * d)
       {
        interval = ms;
        doc = d;
        return CWnd::Create(NULL, // class name, left MFC invent one
    		        NULL, // title, meaningless
    		        WS_CHILD, // child window
    		   	          // conspicuous by its absense:
    			          // WS_VISIBLE
    		        CRect(0,0,10,10), // useless nonempty rectangle
    		        AfxGetMainWnd(), // attach to main window, need someplace
    		        IDC_STATIC); // window ID
      }
    

    Gruß
    patrick


  • Mod

    Dir fehlt eine Message-Map und ein Messagemap Eintrag. Message Handler werden nicht auf der Technik von virtuellen Funktionen genutzt.



  • Martin Richter schrieb:

    Dir fehlt eine Message-Map und ein Messagemap Eintrag. Message Handler werden nicht auf der Technik von virtuellen Funktionen genutzt.

    In den beiden Doc-Classes hab ich eine entsprechende Message-Map installiert.

    IMPLEMENT_DYNCREATE(CTimedDocument, CDocument)
    
    BEGIN_MESSAGE_MAP(CTimedDocument, CDocument)
    	//{{AFX_MSG_MAP(CDocument)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    //und 
    
    IMPLEMENT_DYNCREATE(CDmxTimeDoc, CTimedDocument)
    
    BEGIN_MESSAGE_MAP(CDmxTimeDoc, CTimedDocument)
    	//{{AFX_MSG_MAP(CDocument)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    

  • Mod

    Aber die Timer Nachricht (WM_TIMER) kommt doch in dem CTimerWnd an! Dort wird die benötigt.

    CDocument Klassen können aus WM_COMMAND Nachrichten keine anderen Nachrichten empfangen.



  • Martin Richter schrieb:

    Aber die Timer Nachricht (WM_TIMER) kommt doch in dem CTimerWnd an! Dort wird die benötigt.

    CDocument Klassen können aus WM_COMMAND Nachrichten keine anderen Nachrichten empfangen.

    Das ist richtig; die WM_TIMER Nachricht kommt ja auch an. Da liegt nicht das Problem.

    void CTimerWnd::OnTimer(UINT nIDEvent) 
    {
     if(doc != NULL)
            doc->OnTimerFunc();    //error  
    
     CWnd::OnTimer(nIDEvent);
    }
    

    Das Problem betrifft den Funktionsaufruf im OnTimer -> OnTimerFunc(). OnTimerFunc() stellt eine virtuelle Funktion dar für das CTimedDocument und eine Funktion für die abgeleitete Document-Class CDmxTimeDoc; allerdings wird die Funktion OnTimerFunc() im CDmxTimeDoc nicht aufgerufen...


  • Mod

    patrick p. schrieb:

    Das Problem betrifft den Funktionsaufruf im OnTimer -> OnTimerFunc(). OnTimerFunc() stellt eine virtuelle Funktion dar für das CTimedDocument und eine Funktion für die abgeleitete Document-Class CDmxTimeDoc; allerdings wird die Funktion OnTimerFunc() im CDmxTimeDoc nicht aufgerufen...

    Und wer wird stattdessen aufgerufen?


Anmelden zum Antworten