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 Zitieren
Klotzkopp Geschrieben 28. April 2006 Geschrieben 28. April 2006 Gibt es einen anderen, besseren Ansatz? Ich würde CListBox::ItemFromPoint benutzen. Zitieren
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'. Zitieren
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); Zitieren
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 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.