ON_EN_SETFOCUS kommt nicht an



  • Hallo!

    Ich habe folgende Klasse:

    // ControlFrame.h
    class ControlFrame : public CWnd
    {
    private:
        CEdit m_Edit;
    public:
        bool CreateFrame(CWnd & parentWnd, const CRect & rc)
        {
            if (!CWnd::CreateEx(WS_EX_CONTROLPARENT | WS_EX_LEFT, WC_MY_CLASS, L"", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, rc, &parentWnd, AFX_IDW_PANE_FIRST + 1))
                return false;
    
            if (!this->m_Edit.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPSIBLINGS | ES_AUTOHSCROLL, CRect(20, 20, 100, 40), this, AFX_IDW_PANE_FIRST + 2))
                return false;
    
            // ...
        }
    };
    

    SetFocus für das Edit versuche ich wie folgt zu bekommen. Kommmt aber leider nicht an.

    // ControlFrame.cpp
    
    #define EDIT_CTRL_ID (AFX_IDW_PANE_FIRST + 2)
    
    BEGIN_MESSAGE_MAP(ControlFrame, CWnd)
        ON_EN_SETFOCUS(EDIT_CTRL_ID, &ControlFrame::OnUsernameSetFocus)
    END_MESSAGE_MAP()
    
    void ControlFrame::OnUsernameSetFocus()
    {
        // wird leider nicht aufgerufen :-(
    }
    

    Weiß jemand wo das Problem ist?


  • Mod

    Ohne DECLARE_MESSAGE_MAP weiß Deine Klasse nichts von Deiner Message-Map.



  • Martin Richter schrieb:

    Ohne DECLARE_MESSAGE_MAP weiß Deine Klasse nichts von Deiner Message-Map.

    Sorry hatte ich vergessen anzugeben. Ist natürlich in der Header-Datei von ControlFrame.h angegeben.
    Wie gesagt, die Fokus-Info erhalte ich dennoch nicht und weiß nicht warum. 😞



  • Weiß keiner einen Rat?


  • Mod

    Nimm den Spy++ und schau DIr Deine Hirarchie an. Kontrolliere ob das so stimmt, mit dem was Du Dir vorstellst und dann teste ob WM_COMMAND EN_SETFOCUS gesendet wird und wer die Nachricht bekommt.



  • Ich habe gerade entdeckt, dass das Edit Control eine eigene von CEdit abgeleitete Klasse ist und mit ON_CONTROL_REFLECT(EN_SETFOCUS, OnSetFocus) diese Nachricht bereits behandelt. Ist dann so, dass diese nicht mehr an den Parent weitergeleitet wird?

    Das konnte ich dem TN062: Message Reflection nicht so ganz entnehmen.


  • Mod

    So ist es.
    Wie beim Highlander: "Es kann nur einen geben..." 😉



  • Martin Richter schrieb:

    So ist es.
    Wie beim Highlander: "Es kann nur einen geben..." 😉

    😃 Ok. Danke. Nur blöd wenn jemand seine Klasse ebenfalls wie die MFC (CEdit) nennt, zwar im Namensraum aber ersichtlich war es dennoch nicht auf den 1. Blick.

    Also müsste ich eine Nachricht im Handler der CEdit-Klasse ans Parent senden. Eine Frage dazu: Sendet man hier dann eine eigene Nachricht z.B. WM_EDIT_SET_FOCUS oder würde man das ganze wieder in eine WM_COMMAND-Nachricht verpacken und dann senden?


  • Mod

    Ich würde es als WM_COMMAND Nachricht weitersenden, aber dann hast Du ein Problem, denn die MFC will ja genau diese Nachricht abfangen und als REFLECT Nachricht weitergeben.

    Ich verstehe allerdingsnicht warum Du EN_SETFOCUS überhaupt als REFELECT Nachricht abfängst. Du kannst doch schon gleich WM_SETFOCUS in einer eigenen CEdit Klasse behandeln. Dann würde auch Dein Parent die WM_COMMAND Nachricht weiter erhalten.

    Die WM_COMMAND Nachricht ist ja nur deswegen gebaut worden, damit ein Subclassing nicht notwendig wird.



  • Martin Richter schrieb:

    Ich verstehe allerdingsnicht warum Du EN_SETFOCUS überhaupt als REFELECT Nachricht abfängst. Du kannst doch schon gleich WM_SETFOCUS in einer eigenen CEdit Klasse behandeln. Dann würde auch Dein Parent die WM_COMMAND Nachricht weiter erhalten.

    Hmm, das klingt plausibel. Dann werde ich das wohl einfach mal versuchen zu ändern.


Anmelden zum Antworten