Aktualisieren des Inhalts bei schon vorhandener Programminstanz
-
-
Danke für die Antwort, hatte das auch schon mal gelesen, aber ich bekomme immer folgende Fehlermeldung:
error C2039: 'GetActiveView' : is not a member of 'CWnd'
Weisst du warum? Ich nutze übrigens .NET 2003.
MfG.
-
Paul_C. schrieb:
Danke für die Antwort, hatte das auch schon mal gelesen, aber ich bekomme immer folgende Fehlermeldung:
error C2039: 'GetActiveView' : is not a member of 'CWnd'
Weisst du warum? Ich nutze übrigens .NET 2003.
Ja, du musst noch nach CFrameWnd casten.
-
Also, wenn ich das so schreibe, dann bleibt die Fehlermeldung:
CMyView* pView = dynamic_cast<CMyView*>((CFrameWnd*)AfxGetMainWnd()->GetActiveView());
-
Da fehlt imho eine Klammer:
CMyView* pView = dynamic_cast<CMyView*>(((CFrameWnd*)AfxGetMainWnd())->GetActiveView());
-
Hattest Recht!
Aber nun erhalte ich eine Warnung:warning C4541: 'dynamic_cast' used on polymorphic type 'CView' with /GR-; unpredictable behavior may result
Kann ich die auch noch irgendwie umgehen oder kann ich die schlicht und einfach ignorieren?
-
Du musst in den Projekteigenschaften RTTI einschalten.
-
Ok, vielen Dank!
Nun habe ich ein Problem alles zu verbinden, so das es Sinn macht:Also, ich bekomme nun, wenn ich versuche, meine Anwendung ein zweites Mal zu öffnen, das Handle zum ersten geöffneten Programm:
hWnd.
Dieses Handle habe ich im CMainFrame der zweiten Anwendung, die sich aber danach irgendwann schließt.
Dort will ich dann aber einen Zeiger auf die Ansicht des ersten geöffneten Programms erstellen.
Dachte, ich erstelle ein neues CMainFrame-Objekt mit Hilfe der FromHandle()-Methode. Doch wie mache ich weiter? Oder bin ich auf dem falschen Weg?
-
Eventuell könnte ich auch eine Nachricht definieren, welche ich dann per SendMessage an das hWnd schicke, in dessen Behandlungsroutine einfach von dort die Ansicht aktualisiert wird?!
Was meinst du?EDIT: Mist, habe mich vertan, das Handle habe ich nicht im CMainFrame, sondern in der CMyApp.
-
Das mit der eigenen Nachricht wäre eine Idee.
Oder du schickst WM_CLOSE - und lässt die neue Instanz laufen als wäre nichts gewesen.
-
Das ist natürlich auch "tricky". Ich probiere es mal mit der Nachricht.
Du hattest auch mal irgendwo geschrieben, wie man eine Klasse "forward-inlcuden" (richtig?) kann.
Denn wenn ich den Cast mache, dann erzeugt er ja einen Zeiger vom Typ CMyView.
In der CMainFrame ist ja MyView.h nicht included (wenn ich es mache, dann gibt es wieder eine Menge Fehlermeldungen).
Bevor ich mich um die Fehler kümmern muss, wollte ich mal probieren, ob es nicht mit einem Forward-Inlcude funktioniert. Wie ging das nochmal?
Habe zuerst einfach mal:extern CMyView;
geschrieben, dann kam aber Folgendes:
error C2065: 'pView' : undeclared identifier
error C2061: syntax error : identifier 'CMyView'
-
class CMyView;
Oder Suche mit *Ringinclude* füttern.
-
Die Suche scheint mich manchmal aus mir nicht bekannten Gründen nicht zu mögen.
Danke nochmals!
-
So, doch noch ein Problem:
error C2680: 'CMyView *' : invalid target type for dynamic_cast
Habe nun in der MainFrame den Forward-Include gemacht:
class CMyView
EDIT: Ok, ohne dynamic_cast funktioniert es. Was ist eigentlich der Sinn eines dynamic_casts?
-
dynamic_cast gibt dir NULL, wenn es nicht geklappt hat.
Wenn du aus CWnd ein CEdit machen willst - das aber ein CButton ist, dann bekämst du NULL und wüsstest, dass du mit dem Zeiger nicht arbeiten darfst.
-
Ah!! Man lernt nie aus! Heute habe ich Einiges dazu gelernt.
Danke nochmals. Wenn ich es hinbekomme melde ich mich nochmal.
Wird aber wahrscheinlich morgen erst was.
-
So ein Problem taucht noch auf:
Ich möchte mit SendMessage() meiner View meine Nachricht übermitteln. Als
LPARAM - Argument würde ich gerne den Dateipfad + Dateinamen übergeben.
Da meckert er:h:\C++ error C2597: illegal reference to non-static member 'CMyApp::m_strFile'
Dann habe ich versucht, diese Variable als static zu deklarieren. Dann kommt Folgendes:
error C2664: 'SendMessageA' : cannot convert parameter 4 from 'CString' to 'LPARAM'
Warum geht das nicht?
EDIT: Ich habe es auch mit Zeigern versucht. Das will er auch nicht.
Ich meine, einen String in eine long-Variable zu packen, geht nicht, ist auch klar, aber wie mache ich das denn dann?
-
Wie hast du es versucht? Mit WM_COPYDATA?
-
Du müsstest dort einen Cast einbauen (und in deiner Nachrichtenbehandlung auch wieder zurückcasten nach LPCTSTR)
-
Ne, ich habe in meiner CMyApp - Klasse eine Membervariable, die den Pfadnamen aus der Kommandozeile nimmt.
Dies würde ich gerne übergeben.
Als Nachricht schicke ich meine Selbstdefinierte Nachricht.
Oder meinst du ich sollte zuerst WM_COPYDATA schicken?
Habe das jetzt soweit hinbekommen, dass ich stattdessen einen this-Zeiger mitschicke.
damit wollte ich dann auf die Membervariable zugreifen.
Jedoch habe ich dann in der CMainFrame das Problem, dass der plötzlich die CMyView Klasse nicht mehr kennt, obwohl ich eine Zeile darüber mir einen Zeiger darauf hole!?!CMyView* pView = (CMyView*)(((CFrameWnd*)AfxGetMainWnd())->GetActiveView()); ASSERT(pView); pView->SendMessage(UWM_UPDATEVIEW, NULL, lParam);//hier meckert der
error C2027: use of undefined type 'CMyView'
EDIT: hatte auch das hier versucht:
CMyView* pView = (CMyView*)(((CFrameWnd*)AfxGetMainWnd())->GetActiveView()); ASSERT(pView); HWND hView = pView->m_hWnd // dann meckerte er hier ::SendMessage(hView, UWM_UPDATEVIEW, NULL, lParam);