首先创建CListCtr时设置风格
刚开始没看清楚把LVS_SHOWSELALWAYS设置到扩展风格了。导致鼠标移动到哪,选中项就跟到哪。
看清了时LVS 还是LVS_EX
因为
#define LVS_SHOWSELALWAYS 0x0008
#define LVS_EX_TRACKSELECT 0x00000008
为同一个值
Report风格、失去焦点一直选中、只能单选、带Checkbox功能。不能用shift进行多选。选中时整行高亮。不显示网格线(因为我自绘了,你们根据自己情况设置)
m_listCtrlStation.Create(WS_VISIBLE|WS_CHILD|LVS_REPORT|LVS_SHOWSELALWAYS|LVS_SINGLESEL,CRect(0,0,0,0),this, ID_WND_RTMDEV_LISTCTRL);
DWORD dwStyle = m_listCtrlStation.GetExtendedStyle();
//不要显示网格线
dwStyle |= LVS_REPORT & ~LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT| LVS_EX_HEADERDRAGDROP | LVS_EX_CHECKBOXES;
m_listCtrlStation.SetExtendedStyle(dwStyle);
响应NM_CLICK消息
ON_NOTIFY( NM_CLICK, ID_WND_RTMDEV_LISTCTRL, OnLvnClickListItem )
响应函数如下
void CRtmDevMgrDlg::OnLvnClickListItem(NMHDR *pNMHDR, LRESULT *pResult)
{
//获取单击所在的行号 (单选)
//找出鼠标位置
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_listCtrlStation.ScreenToClient(&point);
//定义结构体
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
//获取行号信息
int itemSel = m_listCtrlStation.HitTest(&lvinfo);
//如何点击到Checkbox上则不处理
if(lvinfo.flags == LVHT_ONITEMSTATEICON)
{
int a = 0;
}
else
{
//单击时先设置所有checkbox为不选
for(int i=0; i<m_listCtrlStation.GetItemCount(); i++)
{
m_listCtrlStation.SetCheck(i,FALSE);
}
m_listCtrlStation.SetCheck(itemSel,TRUE);
}