Message aus Popup Window an View verschicken
-
Hallo,
ich habe da ein Problem was warscheinlich sehr einfach ist, aber leider komme ich nicht darauf wie ich es lösen kann.
Ich kann keine Message von meinem Popup-Window (also: cs.style = WS_POPUP) an meine View verschicken.
Erst mal etwas allgemeines zum Aufbau meines Programms, ich verwende Doc/View-Architektur in einer SDI.
In meine View erstelle ich in der onLButtonDown ein Popup-Window einer Klasse CUnlockedWnd (von CWnd abgeleitet) über die Create-Methode.
Der Window-Style von meinem Popup-Window ist, wie gesagt, WS_POPUP und muss dies auch sein damit ich es auch außerhalb des Bereichs des zugehörigen "Parents" benutzen kann.Ich erledige auch den ganzen Kram (Define der Message, Messagemap usw.) um eine Message zu versenden. Dies tut mein Popup-Window auch einwandfrei, solange es eben KEIN WS_POPUP sondern eine WS_CHILD ist.
Folgenden Code benutze ich zum Senden der Nachricht:
GetParent()->SendMessage(WM_UNLOCKED_EXITBUTTON,0,0);
Sende ich mit WS_POPUP ein Message und schaue mit Spy++ nach, wird keine Message verschickt.
Sende ich mit WS_CHILD wird die versendete Nachricht in meiner View empfangen
Er scheint also mit WS_POPUP keinen gültigen Zeiger mehr auf die View (also seinen Parent) zu bekommen. Ich habe dann dann die folgende Seite zur Hilfe genommen:
http://www.codeguru.com/forum/showthread.php?t=281430
Laut dieser Tabelle man bei einer SDI einen Zeiger auf die View von beliebigen Punkten mit AfxGetMainWnd()->GetActiveView() bekommen.
Bei mir gibt es die Methode GetActiveView gar nicht, wenn ich den Pfeil bei AfxGetMainWnd fertig habe. Und da sollte sie dann ja ein Fensterle mit den möglichen Eingaben öffnen
Ist da was falsch oder mach ich was falsch?Wie komme ich den sonst mit WS_POPUP an einen Pointer von meiner View.
Danke im Voraus.
Gruss Mutche
-
Liefert das GetParent wirklich die View, oder die Frame-Klasse??(Debugger nachschauen) Zur Not explizit nen CWnd-Zeiger des Views mitgeben und mit diesem dann die Nachricht senden.
-
Also wenn ich mit Style WS_CHILD arbeite liefert GetParent() den Pointer auf die View. Und es funktionier alles.
Im fall von WS_POPUP liefert GetParent() einen andern Pointer zurück. Dieser ist Pointer ist identisch wie der von GetParentFrame() oder GetOwner().
-
tjoar dann hast das prob ja gefunden. Dann musst du den Elternzeiger selbst setzen, damit der richtige für dich drinnen steht.
-
tja das habe ich auch schon probiert, mit
SetParent(this)
nachdem ich das POPUP-Windows Created und angezeigt habe.
Leider ergibt sich da ein sehr seltsamer Effekt. Das Popup-Fenster wird in meinem Hauptfenster dargestellt, und wenn ich das Hauptfenster jetzt wegziehe bleibt das Popup-Fenster an der Position an der es erstellt worden ist. Wenn diese Positon ausserhalb meines Fenster ist sehen ich das POPUP-Window natürlich nicht mehr.
Es hat also wieder irgendwie einen Ähnlichen Style wie WS_CHILD angenommen.
-
dann mache dir eine neue CWnd*-Membervariable, wo du den Zeiger extra speicherst.
-
Das habe ich in der zZ. auch gemacht. Sende kann ich jetzt auch Messages an die View.
Leider ist es mir damit aber immer noch nicht möglich auf Methoden(Public) meiner View zuzugreifen. Leider ist die Methode GetAktivView wie es unter :
http://www.codeguru.com/forum/showthread.php?t=281430
beschrieben ist bei mir nicht vorhanden
.