Nachricht an alle Dialoge
-
Wurde doch schon alles gesagt oder?
Warum Nachricht?
- Bau Dir ene Dialog-Basisklasse mit einer Funktion RefreshData.
- Wenn Du einen Dialog der Basisklasse erzeugst, wird dieser sofort in eine statische Liste aufgenommen.
- Beim zerstören des Dialoges wird der Dialog aus der Liste entfernt.
- In einer statischen Funktion RefreshAll in der Dialogklasse lässt Du die Liste ablaufen und jeweils die Funktion RefreshData aufrufen.
-
Martin Richter schrieb:
Wurde doch schon alles gesagt oder?
Warum Nachricht?Weil ich irgendwie nicht mehr an die Funktionen in meinem Dialoge komme.
Wie gesagt, habe ich relativ wenig Ahnung. Ich würde es ja gerne mal für die Zukunft lernen.Beschränken wir uns erstmal auf einen Dialog. Die Liste bekomme ich dann sicher hin.
Ich habe eine Klasse
CDataView in dieser wird CDataViewDlg geöffnet.
Und aus dem CDataViewDlg möchte ich einen C3DViewDlg öffnen. Das mache ich so:CWnd dummy; // damit dialog nicht immer im vordergrund C3DViewDlg = new CViewOpenGl(); C3DViewDlg->Create(IDD_VIEW_OPENGL,&dummy); C3DViewDlg->ShowWindow(SW_SHOWNORMAL);Das klappt so weit.
Nehmen wir an, in meiner CDataViewDlg gibt es eine Funktion MyTest();
Wie komme ich von C3DViewDlg an diese Funktion ran?
Muss ich die Klasse CDataViewDlg erst nochmal in C3DViewDlg einbinden oder gibt es einen "direkten" Weg nach oben?
Und wie würde ich an eine Funktion ganz oben in der CDataView kommen?
Ich will das jetzt endlich mal grundlegend durchschauen
-
Lisa2ab schrieb:
Wie komme ich von C3DViewDlg an diese Funktion ran?
via Send- o. PostMessage.
oder du reichst nen Zeiger durch, was aber glaub ich weniger elegannt ist.
-
Übergib an den Unterdialog einfach ein Interface, oder eben den Zeiger.
Warum dnen auch hier wieder eine Nachricht?
Was soll der Satz: Du kommst nicht mehr an die Funktionen Deines Dialoges? Man kommt immer über die enstprechenden Zeiger an die Funktionen. Ob Du nun ein Handle eines Dialoges hast um eine Nachricht zu senden, oder den Zeiger auf eine Klasse ist ja wohl herzlich egal.
-
Martin Richter schrieb:
Übergib an den Unterdialog einfach ein Interface, oder eben den Zeiger.
Und hier fängt mein Verständnisproblem an. Wie genau geht das?
-
wie das mit dem Interface funzt weis ich nicht aber mit dem Zeiger auf die klasse mal aus dem bauch heraus, sollte so funzen. voraussetzung ist das eine klasse die ander kennt. also entsprechende *.h includen.
class CPrev; class CNext { public: void SetPointer(CPrev *pPrev){m_pPrev = pPrev}; private: CPrev *m_pPrev; }; class CPrev { public: CPrev() { m_Next.SetPointer(this); }; virtual ~CPrev(){}; private: CNext m_Next; };ab dem zeitpunkt der erstellung der klasse CPrev hat die klasse CNext den zeiger auf die klasse CPrev und kann auf die public funktionen und variablen zugreifen.
-
Vielen Dank
Sieht aus, als könnte ich das verstehen was da abläuft.
Nur zur Sicherheit, dass ich mir nicht die doppelte Arbeit mache. Wenn ich mit Microsoft Visual C++ arbeite und dort mit der MFC-Vorlage, dann ist eine solche Funktionalität nicht irgendwie schon "eingebaut"?
Ich sehe da z.B: was von:CViewOpenGl(CWnd* pParent = NULL);Kann man das pParent irgendwie dafür nutzen?
-
hab schon lang nicht mehr mit dem klassenassi vom MFC gearbeitet, aber wenn ich das noch recht in erinnerung habe erbt die CView* von der CWnd, das heist eigendlich das du keinen zugriff auf die funktionen des CViewParent hast sondern nur auf seine CWnd Funktionen.
kann mich aber auch irren

probier es halt einfach mal aus

-
@rT!f@Ct schrieb:
probier es halt einfach mal aus

Einfach sagt sich so einfach wenn man weiß wie. Ich weiß es aber eben nicht besser

Mit pParent. oder pParent-> tut sich jedenfalls nichts beim Intellisense.
Ich versuche ja durch dieses, für mich derzeitige, Wirrwar durchzusteigen.
Alle Tutorials die ich so gelesen habe, gehen zwar auf viele Sachen ein, aber wie ich an Funktionen eines Über-, Unter- oder noch schlimmer Nebengeordneten Dialoges komme, zeigte bisher keines. Entweder zeigen die nur wie man mit drei Mausklicks mal eben einen Dialog anzeigt oder die sind wieder so komplex, dass ich nach dem dritten Satz gar nichts mehr verstehe.
Ich bräuchte mal ein DemoProjekt mit mehreren Dialogen neben und übereinander die gegenseitig Funktionen aufrufen und Variablen austauschen. Gibt es sowas eventuell irgendwo im Netz?
Aller Anfang ist eben schwer. Sorry.
-
Wenn dein Dialog irgendwie mit CWnd verwandt ist, dann kannst du die Methode
CWnd* CWnd::GetParent()aufrufen.
Dazu muss man aber sagen, dass GetParent das in der Hierarchie nächst höhere Fenster zurückgibt. Auch, wenn das selbst ein Child ist.
Sonst gibt es da noch:CWnd* CWnd::GetParentOwner() void CWnd::SetOwner(CWnd* pOwnerWnd)Das Ganze kannst du dann ja passend casten, allerdings muss dann das CWnd-Objekt (oder in deinem Falle das von CWnd abgeleitete) auch noch existieren.
Gruß
eXitus
-
nimm halt mein beispiel was ich dir gegeben habe, und übertrage es auf dein project.
CPrev wäre dein hauptdialog und CNext dein Child bzw. Nebendialog. sobald dein nebendialog den Zeiger des Hauptdialoges hat, kannst du damit arbeiten.
es spielt dabei keine rolle wann (zu welchem zeitpunkt) du den Zeiger des Haupdialoges an den Child/Nebendialog übergibst.das meinte ich mit versuch es halt mal. du kannst nur über try & error lernen. Ich denke es hat noch kein mensch das theoretische auf anhieb so verstanden das er es im ersten versuch fehlerfrei machen konnte. Schon gar nicht wenn man anfänger ist.
Setzt dich hin probier es aus! wenn es dann nicht geht und du gar nicht mehr weiter weist, poste dein problem mit code und einer beschreibung was du machen willst, dann kann man dir weiterhelfen...
Selbst wenn du jetzt den umständlichen weg gehst, wirst du daraus schlauer. es hat auch noch kein anfänger geschafft, auf anhieb ein project zu erstellen, das er im nachhinein nicht x mal umgeschrieben hat.