Nachrichten über einen weitere Klasse umleiten (CWnd)



  • Hallo Leute!

    Eine Frage, ich habe folgende Klasse:

    class MyClass
    {
    mpParentWnd;
    public:
    MyClass(CWnd* pParentWnd)
    {
    mpParentWnd = pParentWnd;
    [...]
    }
    
    [...]
    
    };
    

    Jetzt möchte ich, dass MyClass z.B. nur die Nachricht WM_SIZE von dem übergebenen pParentWnd bearbeitet, sodass aber pParentWnd die Nachrichten weiterhin bekommt - ich möchte die Nachricht also nicht abfangen!

    Wie mache ich das am besten?

    Ich könnte natürlich in der pParentWnd-Klasse die Klasse MyClass explizit in der OnSize()-Routine aufrufen, dachte aber, dass es vielleicht auch anders geht - eben direkt über die MyClass-Klasse.

    Wäre nett, wenn jemand eine Idee hat.
    Danke!

    (Sorry, wenn ich mich ein wenig unverständlich ausgedrückt habe..., ich denke aber, ihr wisst, was ich meine.)

    Gruß 🙂



  • Ich weiß nicht ob du wirklich darüber nachgedacht hast oder ob das ein Witz sein soll aber:

    AFAIK erhält das Parent CWnd die nachricht sowieso:

    Wenn dein Fenster OnSize aufruft dann rufst du in dener MyClass einfach

    GetParent()->OnSize(....,.....)

    auf und schon ist die Nachricht weitergeleitet. Weobei ich dein Problem nicht verstehe denn normal ist es so:

    Erhält das Elternfenster eine NAchricht wird sie wenn nötig an den Child weitergereicht aber sie wird Trotzdem noch in der eigenen Behandlungsmethode behandelt.



  • Sorry, hatte mich ziemlich unklar ausgedrückt. MyClass ist kein CWnd-Objekt und auch damit auch kein Child!

    Habe jetzt PreTranslateMessage() verwendet, um die Nachricht weiterzuleiten. Allerdings empfängt diese Methode nicht alle Messages, z.B. WM_SIZE nicht. Weiß jemand warum? Gibt es noch eine andere Möglichkeit als die WindowProc-Methode zu überladen?

    So sieht es bisher aus:

    class WindowObj : public CWnd
    {
    CMyClass myClass;
    virtual BOOL PreTranslateMessage(MSG* pMsg)
    {
     myClass.PerformMsg(pMsg);
     return CDialog::PreTranslateMessage(pMsg);
    }
    };
    
    class CMyClass
    {
    CWnd* mpParent;
    
    void PerformMsg(MSG* pMsg)
    {
    [..]
    mpParent->[..]
    
    }
    };
    

    Gruß, und sorry, dass ich so unklar formuliere :xmas1:



  • Wenn du mir sagst was du vorhast kann ich dir helfen. Ich bin ein kleiner Klassenakrobat.



  • Leite deine Klasse von CCmdTarget ab und überschreib OnCmdMsg von deinem Fenster.
    In deiner Fensterklasse musst du dann nen Pointer auf die Instanz deiner eigenen Klasse halten und kannst dann in OnCmgMsg die WM_SIZE Nachrichten erstmal an die OnCmdMsg deiner eigenen Klasse weiterleiten.Mit den Rückgabewerten kannst du steuern ob die Nachricht dann noch weiter ihre Route verfolgt oder die Nachricht als bearbeitet gilt.
    :xmas2:

    MfG Spacelord


Anmelden zum Antworten