Veröffentlicht 28. April 200619 j 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
28. April 200619 j Gibt es einen anderen, besseren Ansatz? Ich würde CListBox::ItemFromPoint benutzen.
28. April 200619 j 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'.
28. April 200619 j 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);
3. Mai 200619 j 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
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.