Trapping a double click on CListCtrl
Glenn T. Jayaputera -- gtj@nunkeen.apana.org.au Friday, May 03, 1996 Env: VC4.0/Win95 How do I trap which item index (on CListCtrl object) on which the user has double clicked. I can trap the double click notification but how do I get the info on which item index was that. I tried to cast the *pNMHDR to NM_LISTVIEW * as follows NM_LISTVIEW *pNMLISTVIEW = (NM_LISTVIEW *) pNMHDR but the iItem member of pNMLISTVIEW contains some obsecure number... thanks for your pointers glenn tesla
Norman L Covington -- doubleM@cris.com Saturday, May 04, 1996 [Mini-digest: 8 responses] Glenn T. Jayaputera wrote: > > Env: VC4.0/Win95 > > How do I trap which item index (on CListCtrl object) on which the user > has double clicked. ... Glenn: A method I have used successfully is: int nItem = GetNextItem(-1,LVNI_ALL|LVNI_FOCUSED|LVNI_SELECTED); Hope it helps, Norman doubleM@concentric.net -----From: "Frederic Steppe"Assuming that a double click sets the focus to the clicked item before notification, just call GetNextItem(-1, LVNI_FOCUSED) to get the focused index, which should be the clicked index. Frederic Steppe (frederics@msn.com) -----From: Vincent Mascart <100425.1337@CompuServe.COM> Glenn, You can keep track of the currently selected item in a class member using the following code : in message map: ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, OnItemchangedList) // m_lvList Listview notification handling // void CDosListView::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(pNMListView->uNewState & (LVIS_SELECTED | LVIS_FOCUSED)) { m_iItem = pNMListView->iItem; } *pResult = 0; } -----From: "asha" void X::OnDblClickList(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here POINT pt ; LV_HITTESTINFO HitTestInfo ; ::GetCursorPos(&pt) ; // m_List represents your list control m_List.ScreenToClient(&pt) ; HitTestInfo.pt = pt ; // in client coordinates if(m_List.HitTest(&HitTestInfo) != -1 ) { // These three flags together determine if the position is over // the item if(HitTestInfo.flags == (LVHT_ONITEMSTATEICON | LVHT_ONITEMLABEL | LVHT_ONITEMICON )) { // You can get the item for processing from the HitTestInfo // structure m_List.GetItemState(HitTestInfo.iItem,LVIS_SELECTED) ; } } // end if hit test is successful *pResult = 0; } -----From: Mario Contestabile yourlistview::OnRButtonDown(UINT nFlags, CPoint point) or yourlistview::OnLButtonDblClk(UINT nFlags, CPoint point) { LV_HITTESTINFO lvh; lvh.pt = point; if(m_ListCtrl.HitTest(&lvh) == -1) return; CString Name = m_ListCtrl.GetItemText(lvh.iItem, 0); // Name contains column 0 string } mcontest@universal.com -----From: Frank McGeough The only thing that's there is the NMHDR, unfortunately not the NM_LISTVIEW*. I don't know what the best way is to do this but I solved my problem with dealing with Right clicks and double clicks by grabbing the point on button down and then doing an evaluation in the function of interest (doubleclick, rightclick) // for tree control UINT flags = TVHT_ONITEM; CTreeCtrl& treeCtrl = GetTreeCtrl( ); // m_pt is a POINT that was set in button down methods HTREEITEM treeItem = treeCtrl.HitTest( m_pt, &flags ); if (treeItem != NULL) { // do work } // for list control UINT flags = TVHT_ONITEM; CListCtrl& listCtrl = GetListCtrl( ); int index = listCtrl.HitTest( m_pt, &flags ); if (index != -1) { // do work } As I had minimal information when I solved the problem in this way, I'd appreciate any discussion of other approaches to this problem and especially an explanation of why the pointer that I really want (NM_TREEVIEW* or NM_LISTVIEW*) isn't passed for a right click or double click msg. The NMHDR structure seems pretty useless by itself and when I run into things that I think are useless that usually means that I'm missing something. Explanations? __________________________________________________ Frank McGeough fm@synchrologic.com Synchrologic, Inc. (http://www.synchrologic.com/) Voice: 404.876.3209 Fax: 404.876.3809 -----From: Doug Reese I don't even use the pNMHDR. Here's a sample from my code; m_ctlResultList is a CListCtrl: // get selected item int nItem, nFlags; nFlags = LVNI_SELECTED; nItem = m_ctlResultList.GetNextItem(-1, nFlags ); if ( nItem != -1 ) { // nItem is the 0 based index of the selected item } Hope this helps Doug Reese -----From: erik.heuer@ks-t.no (Erik Heuer) Try using CListCtrl::HitTest Erik Heuer, Kongsberg Simulation & Training, 3600 Kongsberg, Norway E-mail: erik.heuer@ks-t.no Phone:(+47) 32735766 Fax:(+47) 32736965
Frederic Steppe -- FredericS@msn.com Thursday, May 09, 1996 >Glenn T. Jayaputera wrote: >> >> Env: VC4.0/Win95 >> >> How do I trap which item index (on CListCtrl object) on which the user >> has double clicked. ... > Precisions after reading the "[Mini-digest: 8 responses]" For those who tried to find the clicked item using GetNextItem(-1, LVNI_SELECTED), just remember that a CListCtrl may have multiple selection, and the users don't always click on the first one. Using GetNextItem(-1,LVNI_FOCUSED) seems better to me. By the way, it REALLY seems to be the only simple solution, isn't it ? Frederic Steppe (frederics@msn.com)
| Вернуться в корень Архива |