MessageMap



  • Hallo zusammen,

    Eine kleine Dialog Anwendung besitzt ein von CTabCtrl abgeleitetes Member Objekt. Jede Page dieses CTabCtrl besitzt einen Dialog, auf dem ersten ist ein CTreeCtrl, auf dem Zweiten eine CListBox und auf dem dritten ein CEditCtrl. In jeder Dialog Klasse habe ich die MessageMap Funktionen der entsprechenden Controls eingefügt. Funktioniert alles sauber.

    Nun habe ich folgendes Problem:

    Wenn ich die Controls (Tree, Listbox, Edit) nur über Member Objekte realisieren möchten, erhalte ich lediglich die Message vom Tree über die
    ON_NOTIFY(NM_CLICK, 201, OnClickTreeCtrl).
    Die Message ON_LBN_DBLCLK(202, OnDblclkListCtrl) und
    ON_EN_CHANGE(203, OnChangeEditCtrl) kommen nicht an.

    Die Message ON_NOTIFY(TCN_SELCHANGE, 102, OnTabSelChange) wird sauber erkannt, d. h. die gewählte Seit wird angezeigt und auch die Einträge der Listbox dargestellt.

    Kann mir jemand helfen, ich bin ratlos!

    Gruß
    Andre



  • Hallo zusammen,

    ich bin zwar neu hier, hatte aber angenommen das wenigsten eine Antwort kommt oder habe ich mich missverständlich ausgedrückt.

    Daher noch ein zweiter Versuch.

    Wenn ich Ressourcen auf einem Dialog definiere, also mit dem Ressource-Editor erzeuge (z. B. ein CListBox Control) kann ich zur Laufzeit über Command-Message (z. B. ON_LBN_DBLCLK) mit diesem Control Kommunizieren.

    Werden die Controls aber zur Laufzeit mit

    *.h
    ...
    CListBox m_List;
    
    *.cpp
    ...
    OnCreate(...
    
    m_List.Create(WS_CHILD | WS_VISIBLE| WS_BORDER  | LBS_EXTENDEDSEL   , rect, &m_tabctrl, 202);
    m_List.AddString("Ein Eintrag");
    ...
    

    erzeuge, bleiben die Command-Messages ohne Reaktion.

    Worin besteht der Unterschied beim Erzeugen von Ressourcen, statisch in der Application oder dynamisch zur Laufzeit. Oder habe ich ein Control Style vergessen zuzuweisen?

    Wenn mir jemand helfen könnte wäre ich sehr dankbar.

    Gruß
    Andre



  • hast du du korrekten Control IDs in den events angegben?



  • Erst mal besten Dank für die Anteilnahme;-)

    Ja.
    Sorry, hab ich im letzten post vergessen.

    *.h
    ...
    //{{AFX_MSG(...
    afx_msg void OnDblclkListCtrl();
    //}}AFX_MSG
    ...
    
    *.cpp
    ...
        //{{AFX_MSG_MAP(...
        ON_LBN_DBLCLK(202, OnDblclkListCtrl)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    ...
    
    void CMyBar::OnDblclkListCtrl() 
    {
        AfxMessageBox("Hallo von Liste");
    }
    

    Sollte so eigentlich funktionieren, tut's aber nicht.
    Mir ist auch nicht bekannt, dass es einen Unterschied macht, ob ich die Ressource vorab oder erst zu Laufzeit erzeuge. In beiden Fällen wird das Teil im Speicher erzeugt. Es sei denn, MS macht irgendeine Treckigkeit im Hintergrund des Ressourceeditors.

    Ich hab zum Test einmal ein TabCtrl mit 3 Pages erstellt. Jeder Page habe ich Zur Laufzeit ein TreeCtrl zugewiesen inkl. verschiedener Ctrl-IDs. Page1 m_Tree1, Page2 m_Tree2 usw.. Komisch ist dabei, dass es hier funktioniert.

    Der Unterschied zwischen einem TreeCtrl und einem List- oder EditCtrl ist, dass ein TreeCtrl ON_NOTIFY(... verwendet.

    *.cpp
    ...
        ON_NOTIFY(NM_DBLCLK, 201, OnDblclkTree1)
        ON_NOTIFY(NM_DBLCLK, 202, OnDblclkTree2)
        ON_NOTIFY(NM_DBLCLK, 203, OnDblclkTree3)
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    ...
    void CMyBar::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        AfxMessageBox("Hallo vom Tree auf Tab Tree1");
        *pResult = 0;
    }
    void CMyBar::OnDblclkTree2(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        AfxMessageBox("Hallo vom Tree auf Tab Tree2");
        *pResult = 0;
    }
    
    void CMyBar::OnDblclkTree3(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        AfxMessageBox("Hallo vom Tree auf Tab Tree3");
        *pResult = 0;
    }
    

    Gibt es eine Möglichkeit auch für List- oder EditCtrl's ON_NOTIFY(... zu verwenden und wenn ja gibt es vielleicht ein Beispiel hierfür?

    Gruß
    Andre


Anmelden zum Antworten