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
-
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()
-
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...
-
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?