CListCtrl如何选中并高亮特定行

如果在网上搜索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);
    }
原文地址:https://www.cnblogs.com/ljy339/p/15451880.html