如果在网上搜索CListCtrl如何选中并高亮特定行,那么通常是如下的解决方案:
1、设置控件属性
listCtrl.SetItemState(index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
listCtrl.SetSelectionMark(index);
listCtrl.SetFocus();
2、在对话框资源编辑器中将listCtrl的Always show selection属性设置为true
3、将OnInitDialog的返回值改为FALSE。
试了一下不太管用。
提出如下解决办法,亲测有效。
核心思想是找到需要高亮行的位置,模拟鼠标单击事件进行选中高亮。同时可以备份鼠标初始位置,高亮特定行之后进行恢复。
listCtrl.SetItemState(index, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); listCtrl.SetSelectionMark(index); listCtrl.SetFocus(); // 模拟鼠标点击事件,否则不能高亮 const int nFocusRow = listCtrl.GetNextItem(-1, LVNI_FOCUSED); if (nFocusRow >= 0) { // 备份光标初始位置 CPoint initPos; GetCursorPos(&initPos); CRect itemRect; listCtrl.GetItemRect(nFocusRow, itemRect, LVIR_BOUNDS); CRect ctrlRect; listCtrl.GetWindowRect(ctrlRect); // 转换成相对父对话框的 itemRect.left += ctrlRect.left; itemRect.top += ctrlRect.top; parentDlg.ClientToScreen(itemRect); SetCursorPos(itemRect.left + 2, itemRect.top + 2); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); // 恢复光标初始位置 SetCursorPos(initPos.x, initPos.y); }