这个问题困扰了我三天,先描述一下问题所在。
我创建了一个ListControl,并将这个控件放在了一个对话框上面。具体的创建代码如下:
m_meshlistctrl.Create(WS_CHILD|WS_BORDER|LVS_REPORT|LVS_SINGLESELC,Rect(1,1,300,400), this, IDC_LIST1); // IDC_LIST1是我绑定的ListControl资源
m_meshlistctrl.SetWindowPos(this,1,1,300,tabRect.bottom/2-1,SWP_SHOWWINDOW |SWP_NOACTIVATE | SWP_NOZORDER );
m_meshlistctrl.ShowWindow(SW_SHOW);
DWORDdwExStyle = GetExtendedStyle();
SetExtendedStyle( dwExStyle |LVS_EX_ONECLICKACTIVATE| LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES );
我创建完这个ListControl以后 想通过NM_CLICK消息来响应左击ListControl时产生的操作。添加消息响应函数如下:
afx_msg void OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult);//在头文件中添加
ON_NOTIFY(NM_CLICK, IDC_LIST1, &CSimMeshProDlg::OnNMClickList1) //关联处理单击左键函数
然后问题出现了,当我在ListControl中插入几列数据时,点击ListControl中非数据处时,会默认选中几列数据为蓝色高亮显示。而我并没有设置其为高亮状态(此问题原因已经发现:我在插入数据时这样做的:m_meshlistctrl.InsertItem(LVIF_TEXT | LVIF_STATE, i,"", (i % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0);//导致偶数行默认为选中状态)。并且第一次点击ListControl控件非数据部分时,NM_CLICK消息不会得到触发。而当我第二次点击ListControl控件非数据部位时,NM_CLICK消息才会得到触发。我纠结了两三天,这个问题还是没得到解决,但是由于项目需要,我将ListControl的第一行数据设置为默认选中状态,方法如下:
m_meshlistctrl.SetItemState(0, LVIS_SELECTED|LVIS_FOCUSED,/*LVIS_DROPHILITED|*/LVIS_SELECTED|LVIS_FOCUSED);
这样,尽管点击ListControl非数据部位时,仍需要两次才能触发NM_CLICK消息,但是可以将蓝色高亮显示在第一行。勉强算达到要求。MFC博大精深,还需耐住性子,好好研究。在这里记录一下,有大神如果能够帮我解惑,甚为感激。
下面贴出ListControl的一些常规使用的风格:
一:设置ListControl的风格
LONG lStyle;
二:选中和取消选中一行
三:失去焦点后仍然高亮显示一行或熄灭一行
//获得选中行的索引
m_SecCount = (int)m_lc.GetFirstSelectedItemPosition()-1;
//设置选中行一直高亮显示
m_lc.SetItemState(m_SecCount,LVIS_DROPHILITED,LVIF_STATE);
//取消在失去高亮时候选中行的高亮显示
m_lc.SetItemState(m_SecCount,FALSE,LVIF_STATE);
具体更详细的可以参考:http://blog.sina.com.cn/s/blog_635ff3050101luqx.html