• 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);
        }
  • 相关阅读:
    Unity3d在各个平台读取Sqlite3数据库
    UI
    Could..... not preload global game manager
    Asset Store 下载的package存在什么地方?
    NDK下载地址
    UGUI富文本
    Unity播放视频
    让IIS支持无后缀名访问
    PC Android IOS资料同步更新
    PHP memcached 扩展的安装
  • 原文地址:https://www.cnblogs.com/ljy339/p/15451880.html
Copyright © 2020-2023  润新知