Select an item even if click is not on left most column
Posted
by Zafir Anjum
on August 6th, 1998
- Add a WM_LBUTTONDOWN handler in the CListCtrl derived class.
- Code for OnLButtonDown() is given below.
- Before calling HitTest(), the x coordinate is changed to 2. This forces the point being tested to fall on the first column. A value of x below 2 fails (it is presumably occupied by the border ).
- Note that the call to the base class OnLButtonDown() precedes the call to SetItemState.
- This method fails if the first column is not visible. We can use the function HitTestEx() described in an earlier section to cover for the situation when the first column is not visible.
void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
CListCtrl::OnLButtonDown(nFlags, point);
int index;
point.x = 2;
if( ( index = HitTest( point, NULL )) != -1 )
{
SetItemState( index, LVIS_SELECTED | LVIS_FOCUSED ,
LVIS_SELECTED | LVIS_FOCUSED);
}
}

Comments
Other way to do
Posted by Legacy on 09/19/2002 12:00amOriginally posted by: Cristian Georgescu
You don,t have to derived a new class from CListCtrl. Let's suppose that we have dialog window CMyDlg with a listview control m_list. You can handle the NM_CLICK message.
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP
ON_NOTIFY(NM_CLICK, IDC_LIST2, OnClickList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMyDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CPoint pt(pNMListView->ptAction);
pt.x = 2;
int index = m_list.HitTest(pt,NULL);
if (index != -1) m_list.SetItemState(index,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
*pResult = 0;
}
ReplyHighlighting even with click to right
Posted by Legacy on 05/28/2000 12:00amOriginally posted by: Don Stauffer
It seems to me (at least according to the testing I've done, which is on a multiselect ListView), you have to hook the LVM_HITTEST message also and change the X coordinate on it. Otherwise it doesn't work, for instance, if you have a group of items selected and you try to click on one of them but at the far right.
I also feel more comfortable using LVM_GETITEMRECT and averaging the Right and Left members, rather than assuming 2 will alway be a good choice for a replacement X value.
ReplyNew for Version 4.71 of the control
Posted by Legacy on 12/08/1999 12:00amOriginally posted by: Daniel BERMAN
Now from version 4.71 and up you can use the NM_CLICK notification.
From the help file:
This notification is identical to the standard NM_CLICK notification except that in version 4.71 and later, the list view supplies an NMITEMACTIVATE structure instead of an NMHDR structure for the lParam.
Version 4.71 recieves the address of an NMITEMACTIVATE structure that contains additional information about this notification message. The iItem, iSubItem, and ptAction members of this structure contain information about the item.
Best Regards,
ReplyDaniel BERMAN