CTreeCtrl und Kontextmenü



  • Hallo Leute,

    ich habe ein Problem, und zwar möchte ich in ein CTreeCtrl mit der rechte Maustaste ein Kontextmenü erzeugen können. Zwei Ziele sollen ereicht werden:

    1.Das Item, der mit der rechte Maustaste angeklickt wird, soll markiert werden.
    2.Es soll an diese stelle ein Kontextmenü(beinhaltet Edit,Neu,Details)eröffnet
    werden, der dann die Möglichkeit bietet an diese stelle ein neue Item
    Hinzuzufügen.

    Ich würde mich über jede kleine Hilfe sehr freuen, danke im Voraus. 🙂



  • Das TreeCtrl schickt ans Parent NM_CLICK. Die Message kannst du behandeln und mit CMenu::TrackPopupMenu dein Kontextmenü anzeigen. (Mit CTreeCtrl::HitTest holst du dir das Item.) Mit CTreeCtrl::SetItemState kannst du es dann markieren.

    [ Dieser Beitrag wurde am 12.11.2002 um 09:44 Uhr von Nemesyzz editiert. ]



  • OK, ich werde es gleich probieren, danke.



  • ich wiess nicht, aber irgendwie reagiert ::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult) nur auf die Linke Maustaste. Kannst du es mir vieleicht etwas näher erklären, oder ein Beispiel schicken.



  • NM_RCLICK

    Wenn du die Ereignisse deines Steuerelemntes ansiehst findest du auch das richtige

    [ Dieser Beitrag wurde am 12.11.2002 um 10:23 Uhr von Unix-Tom editiert. ]



  • Ja, das klappt jetzt besser, aber ich hab noch ein Problem.
    Die Funktion pmyTreeCtrl->HitTest(myPoint, &uFlags); braucht ein CPoint, wie
    besorge ich mir dieses CPoint, vom Item.



  • GetCursorPos & ScreenToClient...



  • hier bin ich wieder

    also ich versuche es schon seit ein paar Stunden, das Problem ist: Es werden mehrere Items markiert, Kontextmenü wird irgendwo erzeugt aber nicht da wo ich es haben will.Hier ist mein Code:
    void CloeschenversuchView::OnNMRclickTree(NMHDR *pNMHDR, LRESULT *pResult)
    {
    CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(IDC_TREE);
    DWORD pos = GetMessagePos();
    CPoint pt(LOWORD(pos), HIWORD(pos));
    ScreenToClient(&pt);

    UINT i, uCount = pTree->GetVisibleCount();
    HTREEITEM hItem = pTree->GetFirstVisibleItem();

    for (i=0;i < uCount;i++)
    {
    CRect r;
    pTree->GetItemRect(hItem,&r,FALSE);
    if (r.PtInRect(pt) && hItem != NULL)
    {
    //ASSERT(hItem != NULL);
    UINT flag = LVIS_SELECTED | LVIS_FOCUSED;
    pTree->SetItemState(pTree->HitTest(pt), flag, flag);

    CMenu* menu_bar = AfxGetMainWnd()->GetMenu();
    CMenu* file_menu = menu_bar->GetSubMenu(4);
    ASSERT(file_menu);
    file_menu->TrackPopupMenu(TPM_LEFTALIGN
    |TPM_RIGHTBUTTON, pt.x,
    pt.y, GetDlgItem(IDC_TREE));
    }
    hItem = pTree->GetNextVisibleItem(hItem);
    if(hItem == NULL)
    break;
    }

    *pResult = 0;
    }

    was mache ich Falsch, Hiiiiiiiiiilfe 😡



  • Hast du es schonmal mit GetCursorPos probiert?



  • Ja habe ich es klappt auch nicht.



  • Aso: Das ScreenToClient nat. vom TreeCtrl!

    [ Dieser Beitrag wurde am 12.11.2002 um 15:35 Uhr von Nemesyzz editiert. ]



  • es funzt nicht auch mit pTree->ScreenToClient(&pt) nicht.



  • Uuuupppsss. Sorry. Hab da was verwechselt... *gg*
    Lass das ScreenToClient einfach mal weg... 🙂

    Für HitTest brauchst du es aber!

    [ Dieser Beitrag wurde am 12.11.2002 um 15:42 Uhr von Nemesyzz editiert. ]



  • Das Blöde dabei ist daß GetVisibleCount(); mir immer ein Konstante Wert von 15 zurückgibt.



  • ich habe es auskommentiert aber jetzt geht er nicht mehr im If zweig rein.



  • Die Funktion gibt dir zurück wieviel Items sichtbar sind. In einem TreeCtrl kann man nur ein Item markieren.



  • CMenu::TrackPopupMenu: Bildschirmkoordianten (GetCursorPos)
    CTreeCtrl::HitTest: Clientkoordianten (Bildschirmkoordianten mit ScreenToClient umrechnen)



  • Es werden aber immer mehr Items makiert je mehr ich Klicke


Anmelden zum Antworten