GetParent() <- wo gebe ich an welches Fenster das Parent ist?



  • Nein, das wirst du wohl tun müssen Michael.



  • Daraus kann man aber wirklich nicht viel sagen, da wir ja gar nicht wissen, wie sein SendMessage überhaupt genau aussieht - wenn ich das richtig verstanden habe, ist das Handle auf jeden Fall mal richtig, oder?



  • aa schrieb:

    Nein, das wirst du wohl tun müssen Michael.

    Geht nicht Frau Aa, ich muß noch mit der Katze von flenders Nachbarin gassie gehen.

    OK, ist bissel wie nen Rätsel, was ich bisher verstanden habe, ist:
    - er sendet mittels SendMessage() nachrichten aus einem Childwindow zu seinem Parent, das Parent-Handle will er via GetParent() holen.
    - dies schlug fehl, da vermutlich das Childwindow beim CreateWindow unter ParentHWND nicht das Handle des Parents, sondern des Desktops erhielt.
    - nun hat er beim Createwindow des Childs das Handle des Parents richtig gesetzt, aber denoch erhält das Parent keine Message, in der Form wie er es zuvor hatte.

    Wenn ich gewonnen habe, bitte meinen Gewinn an die Krebsaugen-Stiftung spenden. 🕶



  • Der Fehler ist nicht bei SendMessage zu suchen. Ich habe schon in einem anderem Programm Probleme mit der Funktion GetParent gehabt und es dort dann anders gelöst. Ich bin ziemlich sicher das der Fehler bei GetParent liegt.

    Trozdem nochmal mein SendMessage Aufruf:

    ...
    SendMessage(GetParent(hwnd),WM_XYMESSAGE,0,0);
    ...
    


  • Hast du schon den Tipp von Micha ausprobiert? (GetWindowLong)



  • Ne aber das war ja auch nicht die Frage...

    Kann es sein das man WS_CHILD mit angeben muss??? (ungetestet)



  • Also ich habe das mit GetWindowLong mal probiert und es funzt.

    Ich würde tozdem gerne wissen woran es bei GetParent hängt



  • Das hast du schon selbst beantwortet, GetParent funktioniert nur bei Childs.



  • Also ich entnehme mal deiner Antwort das das nur mit WS_CHILD funktioniert. Oder nicht



  • flammenvogel schrieb:

    Also ich entnehme mal deiner Antwort das das nur mit WS_CHILD funktioniert. Oder nicht

    Das gibt man gewöhnlicherweise ja bei Childs auch an 😉



  • @Flenders: man könnte aber nach der Beschreibung von hwndParent vermuten, das alle Fenster die hier nicht NULL bei CreateWindow übergeben bekommen Childs sind ...

    (Da wo es Eltern sind auch Kinder sind ...)





  • flammenvogel schrieb:

    @Flenders: man könnte aber nach der Beschreibung von hwndParent vermuten, das alle Fenster die hier nicht NULL bei CreateWindow übergeben bekommen Childs sind ...

    (Da wo es Eltern sind auch Kinder sind ...)

    Mann soll ja auch nicht meinen, man sollte in der MSDN schauen, den da stehts geschrieben.

    *F: Was ist den MSDN?
    A: Die Bibel der Windows-Programmierer
    F: Aha, und was für eine Religion haben die?
    A: WinAPI?
    F: Bohr, haben die auch Kirchen oder so?
    A: Ja, http://c-plusplus.net
    F: Kannte ich alles gar nicht, zahlen die auch Kirchensteuer dafür oder so?
    A: Nein, nur Onlinegebühren
    *



  • @MichaM: Deinen letzten Beitrag kann ich nun wirklich nicht nachvollziehen. Wenn man sich das was zu GetParent in der MSDN steht mal durchließt, steht da in etwa folgendes:

    Liefert entweder das Parent oder den Owner zurück. Wenn bei CreateWindow in der MSDN ein Parameter hwndParent heißt, dann kann man doch meinen das dies das HWND ist auf das sich GetParent bezieht. 😕

    edit: selbst in dem Link von owner steht das die MSDN in diesem Punkt scheiße ist und geschlampt hat.



  • PSDK Help schrieb:

    The GetParent function retrieves the handle of the specified child window's parent window.

    Schau dir auch mal SetParent() an, damit kannst du das Parent für Popup, Overlapped und natürlich Child Windows setzten.

    wenn du bei createwindow den parent angiebts, aber es kein child ist, haut es nicht hin. im endefeckt sind alle "normalen" Fenster dem Desktop untergeordnet, möchtest du eine hierarchy der Fenster, so setzt du das mit SetParent.
    Bei normalen Anwendungen bzw. Fenstern ist das aber nicht üblich und auch nicht sicher, bei mdi anwendungen schon ehr.

    wenn du mit vielen Fenstern arbeitest und du stehts den Parent erfragen willst/muß, dann köntest du auch eine map verwenden

    #include <map>
    //.....
    static std::map <HWND, HWND> PHandleMap;
    void mapSetParent(HWND,HWND);
    HWND mapGetParent(HWND);
    
    //...
    
    void mapSetParent(HWND myHandle, HWND ParentHandle)
    {
       PHandleMap[myHandle] = ParentHandle;
    }
    HWND mapGetParent(HWND myHandle)
    {
       return PHandleMap[myHandle];
    }
    

    mit map´s lassen sich viele sachen einfach und sicher verwalten.
    Und wenn es nun wirklich viele Fenster sind, solltest du eine Klasse für Fenster erstellen, beim erstellen einer Instance dieser Klasse kann der this zeiger in einer map gespeichert werden, beim aufruf einer gemeinsamen, static WndProc kann man den this zeiger wieder auslesen und zum Klassennamen casten.
    Vorteil ist OO, in der WndProc kannst du dann die Messages bearbeiten und entsprechende Events der Klasse aufrufen, wie z.B. OnKeyDown.



  • Das steht im Plattform SDK nicht in der MSDN ...


Anmelden zum Antworten