CTreeCtrl OnRButtonDown geht nicht



  • BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ...
    ON_WM_RBUTTONDOWN()
    ...
    END_MESSAGE_MAP()
    
    void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point)
    {
    UINT uFlags;
    HTREEITEM hItem = m_mainTree.HitTest(myPoint, &uFlags);
    
    if (!hItem)
    return;
    
    BuildMenu();
    }
    

    es wird nicht erkannt, dass ein Item angeklickt wurden, wieso, was vergesse ich?



  • Ich nehme mal an dass das TreeCtrl ein Child-Fenster deines CMainFrame ist.
    Dann solltest du die Notification-Message NM_RCLICK behandeln.

    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
            ...
    	ON_NOTIFY(NM_RCLICK, IDC_TREE1, OnRclickTree1)
            ...
    END_MESSAGE_MAP()
    
    void CMainFrame::OnRclickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
    	*pResult = 0;
    }
    

    Die Botschaft WM_RBUTTONDOWN wird an das CTreeCtrl bei einem Rechtsclick gesendet, nicht an das CMainFrame. Das TreeControl benachrichtigt seinen Parent ( CMainFrame ) über die Notification Message WM_NOTIFY + NM_RCLICK über den Rechtsklick im TreeCtrl. Das kannst du in der MSDN nachlesen.



  • es wird erkannt, dass es die rechte maus down ist, es wird aber nicht erkannt, das es auf einem item ist.



  • Ist jetzt nur eine Vermutung, aber kann es sein, dass die Koordinatensysteme der POINT-Koordinaten nicht übereinstimmen ?

    WM_RBUTTONDOWN auf dem FrameWnd liefert die Koordinaten relativ zum linken oberen Eck des CMainFrame

    HitTest erwartet die Koordinaten relativ zum CTreeCtrl.

    void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point)
    {
       MapWindowPoints( &mainTree, (LPPOINT)&point, 1 );
       HTREEITEM hItem = m_mainTree.HitTest(point, &uFlags);
    }
    


  • jetzt habe ich mist gebaut.
    es leuft jetzt nur im dialog, im tree reagiert es garnicht mehr
    es ist ein 0815 dialog mit CTreeCtrl und 2 buttons drin.


  • Mod

    Morides schrieb:

    es wird nicht erkannt, dass ein Item angeklickt wurden, wieso, was vergesse ich?

    void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point)
    {
      [b]Default();[/b]
      UINT uFlags;
      HTREEITEM hItem = m_mainTree.HitTest(myPoint, &uFlags);
    
      if (!hItem)
        return;
    
      BuildMenu();
    }
    

    Ohne dass Du den rechten Mausklick an die Elternklasse weitergibst wird es auch kein Item selektieren.

    Wenn es Dir aber um ein Context Menü geht:
    http://support.microsoft.com/kb/222905/en-us



  • jetzt werden die Items erkannt, aber es wird nicht das erkannt worauf man geklickt hat, sondern ein Item was 2 items tiefer ist.
    Wieso?
    habe es nach http://support.microsoft.com/kb/222905/en-us erstellt.

    ahja ich brauch sowas in der art:

    ON_NOTIFY(NM_CLICK, OnClick)
    

    wo ich keine ID eingeben muss.


Anmelden zum Antworten