Sendmessage und Konsorten
-
Hallo,
ich hab zwar schon beiträge hier im Forum durchsucht aber sorichtig hab ich das mit der SendMessage-Funktion noch net verstanden.
Mein Problem ist das ich in einer SDI Anwendung ein Objektgerüst in dem Doc-Objekt erstelle und es durch abfragen über Dialogfelder initialisiere.
ob es Komplett aufgebaut wurde, kontolliert eine Funktion im Doc-Objekt.
Diese Funktion sollte dann eine Message an das View-Objekt schicken welches dann über eine Funktion ein CtrlTab initialisieren soll jenes dann auf mehren Seiten die gesammelten Daten des Objektgerüstes in einem ListCtrl wieder gibt.Laut Mehreren Beiträgen:
hab ich dann in meine Quelltexte
//Doc Header #define WM_AUSGABE 101 //Doc Cpp { m_pcks.m_ckmKnMenge.m_nMoeglicheKnotenmenge=m_pcks.m_ckmKnMenge.m_nTatsaechlicheKnotenmenge; m_pcks.m_ckmKnMenge.m_fnTatsKnFeldAllok(); m_pcks.m_ckmKnMenge.m_fnKnFeldCopy(); m_pcks.m_ckmKnMenge.m_fnMoeKnFeldLoeschen(); :arrow: PostMessage(ID_AUSGABE,0,0); } } //View Header afx_msg void OnAusgabe(); virtual BOOL PreTranslateMessage(MSG* pMsg); //View Cpp IMPLEMENT_DYNCREATE(CKabelstPrfView, CRecordView) BEGIN_MESSAGE_MAP(CKabelstPrfView, CRecordView) // Standarddruckbefehle ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview) ON_COMMAND(ID_AUSGABE, OnAusgabe) :arrow: ON_MESSAGE(WM_AUSGABE,OnAusgabe) END_MESSAGE_MAP() //und BOOL CKabelstPrfView::PreTranslateMessage(MSG* pMsg) { if(pMsg ->message == WM_AUSGABE) { OnAusgabe(); } return CRecordView::PreTranslateMessage(pMsg); }Eingefügt aber ich bekomme immernoch fehler.
Fehler:
c:\dokumente und einstellungen\twist\eigene dateien\visual studio projects\kabelstprüf\kabelstprüf\kabelstprüfview.cpp(27) : error C2440: 'static_cast': 'void (__thiscall CKabelstPrfView::* )(void)' kann nicht in 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)' konvertiert werden
Keine Funktion mit diesem Namen im Gültigkeitsbereich stimmt mit dem Zieltyp überein
KabelstPrüfDoc.cppc:\dokumente und einstellungen\twist\eigene dateien\visual studio projects\kabelstprüf\kabelstprüf\kabelstprüfdoc.cpp(144) : error C2664: 'PostMessageA': Konvertierung des Parameters 1 von 'CKabelstPrfDoc *const ' in 'HWND' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Was mach ich noch Falsch?
Mit freundlichen Grüssen!
Twist
-
Hallo Twist,
ich antworte dir mal trotz deiner doofen Signatur...Erstmal solltest du keine Message mit 101 definieren, das ist nämlich im Bereich, den Windows sich reserviert. Die vom Benutzer definerten Messages müssen mindestens den Wert WM_USER haben. Also z.B.
#define WM_AUSGABE (WM_USER + 101)Dann musst du sicherstellen, dass du die Message auch sicher an den View schickst.
Also:POSITION viewpos = GetFirstViewPosition(); CView *view = GetNextView(viewpos); if (view != NULL) view->PostMessage(WM_AUSGABE)Der View muss dann einen Messagehandler haben, der so aussieht
afx_msg LPARAM OnAusgabe(WPARAM wpar, LPARAM lpar);Dein Eintrag in der MessageMap ist ok:
ON_MESSAGE(WM_AUSGABE, OnAusgabe)Die Abfrage in PretranslateMessage brauchst du nicht. Die Funktion OnAusgabe wird automatisch über die MessageMap aufgerufen.
-
Erstmal Danke für deine Antwort trotz meiner Signatur!
Ich hab es jetzt umgeschrieben.
doch jetzt bekomme ich neue Fehler!
die Funktion OnAusgabe hat jetzt keinen Zugriff mehr auf die View elemente.
Warum auch immer.meine Eintragungen:
//View Cpp bei den Meldungshandler void OnAusgabe() { CKabelstPrfDoc* pmyDoc=GetDocument(); m_AusgabeTab.m_fnInit2(pmyDoc); Invalidate(); } // CKabelstPrfView Meldungshandler afx_msg LPARAM OnAusgabe(WPARAM wpar, LPARAM lpar); //View Header protected: void OnAusgabe(); afx_msg LPARAM OnAusgabe(WPARAM wpar, LPARAM lpar); };Fehler:
c:\dokumente und einstellungen\twist\eigene dateien\visual studio projects\kabelstprüf\kabelstprüf\kabelstprüfview.cpp(115) : error C3861: 'GetDocument': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
c:\dokumente und einstellungen\twist\eigene dateien\visual studio projects\kabelstprüf\kabelstprüf\kabelstprüfview.cpp(116) : error C2065: 'm_AusgabeTab': nichtdeklarierter Bezeichner
c:\dokumente und einstellungen\twist\eigene dateien\visual studio projects\kabelstprüf\kabelstprüf\kabelstprüfview.cpp(116) : error C2228: Der linke Teil von '.m_fnInit2' muss eine Klasse/Struktur/Union sein
Typ ist ''unknown-type''
c:\dokumente und einstellungen\twist\eigene dateien\visual studio projects\kabelstprüf\kabelstprüf\kabelstprüfview.cpp(117) : error C3861: 'Invalidate': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefundenIst leider mein erstes Windowsprogramm welches mit der mfc arbeitet!
Mit freundlichen Grüssen!
Twist
-
Bitte!
-
Deine Funktion OnAusgabe ist ja gar nicht Member von CKabelstPrfView.
Es muss so aussehen:[cpp]//View Cpp
bei den Meldungshandler
void **CKabelstPrfView::*OnAusgabe(WPARAM wpar, LPARAM lpar)
{
CKabelstPrfDoc pmyDoc=GetDocument();
m_AusgabeTab.m_fnInit2(pmyDoc);
Invalidate();
}// CKabelstPrfView Meldungshandler
afx_msg LPARAM OnAusgabe(WPARAM wpar, LPARAM lpar);//View Header
protected:
//void OnAusgabe(); Löschen!
afx_msg LPARAM OnAusgabe(WPARAM wpar, LPARAM lpar);
};[/cpp]
-
Danke,
hab ich übersehen.