TinTin Geschrieben 28. April 2006 Geschrieben 28. April 2006 Servus, ich habe in einem Dialog ein Steuerelement von Typ CCheckListBox. In diesem Kann ich die einzelnen Items mit der rechten Maustaste markieren. Die Eigenschaften stehen u.a. auf Einzelauswahl. Ich habe mir überlegt, dass ich die Items aber auch gerne mit der rechte Maustaste markieren und ein Kontextmenu anzeigen möchte. so sieht mein Code aus: void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint point) { // Info: CCheckListBox m_lbFileList; CRect rect; BOOL bIsItem = FALSE; int iStep = 0, iCount = m_lbFileList.GetCount(); while (iStep < iCount && bIsItem == FALSE) { m_lbFileList.GetItemRect(iStep,rect); ClientToScreen(&rect); bIsItem = rect.PtInRect(point); iStep++; } if (bIsItem == TRUE) { m_lbFileList.SetCurSel(iStep-2); CMenu menu; if (menu.LoadMenu(IDR_MENU_LIST)) { CMenu *psmenu = menu.GetSubMenu(0); ASSERT(psmenu); psmenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x ,point.y, this); } } } Diese Code funktioniert, bis auf einen kleinen Fehler. Wenn ich auf den letzten Eintrag der ListBox klicke (rechts), wird der Eintrag nicht markiert und ich bekomme kein Menü. (bIsItem = FALSE)Bei allen anderen Items Funktioniert der Code. Meine Frage, was übersehe ich hier? Gibt es einen anderen, besseren Ansatz? Ciao TinTin
Klotzkopp Geschrieben 28. April 2006 Geschrieben 28. April 2006 Gibt es einen anderen, besseren Ansatz? Ich würde CListBox::ItemFromPoint benutzen.
TinTin Geschrieben 28. April 2006 Autor Geschrieben 28. April 2006 Ich würde CListBox::ItemFromPoint benutzen. Die MSDN sagt dazu folgendes: Note Because the Win32 message LB_ITEMFROMPOINT works only with Windows 95, ItemFromPoint, which wraps the Win32 message also works only with Windows 95. Und Sie hat recht, unter win2000 bekomme ich kein brauchbaren Ergebnisse, darum ja der ganze 'Quatsch'.
Klotzkopp Geschrieben 28. April 2006 Geschrieben 28. April 2006 Stimmt, die tut's nicht. Aber das iStep - 2 macht mich stutzig. Ich vermute, dass du die Koordinaten falsch umrechnest. Die Koordinaten von GetItemRect sind relativ zur Listbox, aber du rechnest über deinen Dialog in Bildschirmkoordinaten um. Damit hast du eine Verschiebung. Rechne bitte mal so um: [b]m_lbFileList.[/b]ClientToScreen(&rect);
TinTin Geschrieben 3. Mai 2006 Autor Geschrieben 3. Mai 2006 Sorry, hatte heute erst Zeit... Aber das iStep - 2 macht mich stutzig. Richtig, dass sollte dich stutzig machen. [b]m_lbFileList.[/b]ClientToScreen(&rect); Code funktioniert! Danke TinTin
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden