Message Problem



  • Ich sehe wahrscheinlich den Wald vor Baeumen nicht, aber vielleicht kann mir ja jemand auf die Spruenge helfen ...
    Habe eine von CComboBox abgeleitete Klasse. In dieser ueberschreibe ich OnKillFocus. Jetzt definiere ich einen Member vom Type MeineComboBox. In dieser möchte ich aber die OnKillFocus auch noch einmal (zusaetzlich) behandeln/bekommen. Wie macht man das am elegantesten ?

    Freudi



  • Ich denke den Member definieren als

    CMyCombobox m_MyComboBox;
    

    wobei die CMyComboBox deine von CComboBox abgeleitete Klasse ist.

    dann sollte deine ComboBox die Überschriebenen Funktionen aufrufen.

    Wenn du allerdings

    CComboBox m_MyComboBox;
    

    als Membervariable definierst, merkt deine KomboBox nix von den Überschreibungen!

    Ist mir auch schon passiert.
    Die Membervariablen würede ich mit dem Klassenassistenten erstellen.



  • Geh einfach mit dem Klassenassi rein und lass dir die Methode OnKillFocus() zu deinem Member erstellen.
    Dort machst du dann deinen "Kram" und rufst dann die Basisklasse auf.



  • Genau das geht irgendwie nicht. Habe mit dem Klassenassi OnKillFocus definiert aber die Funktion in der Member wird nie aufgerufen. Wenn ich aber einen Breakpoint in der Basisklasse in OnKillFocus setze geht er da durch. Ich denke ich müsste in der Basisklasse dafür sorgen das die Message auch an das Control das durch den Member definiert ist weitergeleitet wird.
    Ist vielleicht nicht einfach zu verstehen ...

    class CMyComboBox : public CComboBox
    { ...
    afx_msg void OnKillFocus();
    ...}

    CMyComboBox::CMyComboBox()
    {}
    BEGIN_MESSAGE_MAP(CMyComboBox, CComboBox)
    //{{AFX_MSG_MAP(CMyComboBox)
    ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillFocus)
    .....

    void CMyComboBox::OnKillFocus()
    { // Wird aufgerufen }

    class CMyDlg : public CDialog
    {
    CMyComboBox m_cb;
    ....
    afx_msg void OnKillfocusCb();
    }

    CMyDlg::CMyDlg()
    {}

    BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    ON_CBN_KILLFOCUS(IDC_CB, OnKillfocusCb)

    void CMyDlg::OnKillfocusCb()
    { // Wird nie aufgerufen }



  • Also ich verstehe noch nicht so ganz, was du eigentlich willst.

    void CMyComboBox::OnKillFocus()
    { // Wird aufgerufen }
    

    Also du sagst ja, daß die Funktion aufgerufen wird.

    was meinst du mit

    Jetzt definiere ich einen Member vom Type MeineComboBox. In dieser möchte ich aber die OnKillFocus auch noch einmal (zusaetzlich) behandeln/bekommen.

    Möchtest du, dass OnkillFocus nochmal aufgerufen wird, ohne daß man mit der Maus den Focus verlässt? Also vom Programm aus gesteuert?
    Dann versuchs mal mit

    LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
    

    wobei die Message WM_KILLFOCUS sein sollte.

    Durch den Aufruf
    

    m_cb.SendMessage(WM_KILLFOCUS);
    [code]
    wird die Nachricht Killfocus an deine ComboBox gesendet und damit die Memberfunktion Killfocus nochmals aufgerufen.



  • Hmm scheint doch schwierig zu erklaeren.
    Es ist so das ich CMyCombobox ja oft verwende. Und im allgemeinen ist es OK wenn darin OnKillFocus definiert ist und aufgerufen wird. Jetzt gibt es aber im Programmablauf Fälle wo noch zusätzlich etwas zu tun ist was CMyCombobox aber nicht weiss. Sagen wir mal ich habe eine ComboxBox für Orte definiert.
    CMyCombox m_cbOrte;

    Und wenn der Nutzer diese Combobox verlaesst soll noch etwas in meinem Dialog passieren. Aber der Dialog selber bekommt garnicht mit das jetzt gerade eine Combobox verlassen wurde, weil die Message ja schon von CMyCombobox verarbeitet wurde.
    Kann ich in der Klasse CMyComboBox nicht irgendwie der Funktion OnKillFocus die Nachricht OnKillFocus so absetzen das die Methode m_cbOrte::OnKillFocus auch noch aufgerufen wird ?

    Freudi



  • Also das mir ist noch immer nicht so ganz genau klar, was du meinst.
    Jedenfalls, wie ich schon letztesmal erwähnt habe, mit SendMessage kannst du die Funktion OnKillFocus vom Program aus aufrufen.

    Wenn du aber zusätzlich willst, daß dein Dialog beim Aufruf von CComboBox::OnKillFocus etwas macht, dann würde ich in der Klasse CMyCombobox ein include machen:

    #include MyDialog.h
    

    dann mit in deiner OnKillFocus Fuction implementieren:

    CMyDialog* pDialog = (CMyDialog*) GetParent();
    pDialog-> ...
    

    mit pDialog-> ... kannst du dann deinem Dialog sagen, wass er machen soll.
    Ich hoffe das hift dir weiter.



  • Hey Danke. Das wars! Wusste doch das es ne einfache Lösung gibt 🙂
    Auf die Idee mit dem parent bin ich nicht gekommen.

    Danke
    Freudi


Anmelden zum Antworten