让CListCtrl选中行保持其蓝色高亮状态

具体可参考CSDN帖子:http://bbs.csdn.net/topics/320214522。在使用list control 控件时,当点击其它对话框或控制时,要想让控件保持选中行为高亮(比如一般为蓝色),我们可以在控件中右击添加NM_CUSTOMDRAW事件响应函数,同时需要把控件的Show Always Selection属性置为false

具体代码如下:

void CAutodata::OnNMCustomdrawListAutodata(NMHDR *pNMHDR, LRESULT *pResult)
{
 NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
 
    *pResult = CDRF_DODEFAULT;
 
    if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
    {
        *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
    {
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
    {
 
        COLORREF clrNewTextColor, clrNewBkColor;
 
        int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
        
        POSITION pos = m_ListData.GetFirstSelectedItemPosition();
        int index = m_ListData.GetNextSelectedItem(pos);
        
        if (index == nItem)//如果要刷新的项为当前选择的项,则将文字设为白色,背景色设为蓝色
        {
            clrNewTextColor = RGB(255,255,255);        //Set the text to white
            clrNewBkColor = RGB(49,106,197);        //Set the background color to blue
        }
        else
        {
            clrNewTextColor = RGB(0,0,0);        //set the text black
            clrNewBkColor = RGB(255,255,255);    //leave the background color white
        }
 
        pLVCD->clrText = clrNewTextColor;
        pLVCD->clrTextBk = clrNewBkColor;
 
        *pResult = CDRF_DODEFAULT;
    }
}

其中m_ListData为控件添加的变量。经测试OK。

在MFC(Microsoft Foundation Classes)中,`CListCtrl` 是一个用于显示列表项的控件,比如文件夹视图。要对 `CListCtrl` 中选中的某数据进标色,你可以通过处理消息映射中的 `LVN_ITEMCHANGED` 通知消息来实现。这个消息会在列表项被改变时触发,比如被选中或取消选中。 以下是一个基本的示例步骤,展示如何实现这一功能: 1. 在你的 `CListCtrl` 派生类中添加消息处理函数,比如 `OnItemChanged`。 2. 在消息映射中,将 `LVN_ITEMCHANGED` 消息与 `OnItemChanged` 函数关联起来。 3. 在 `OnItemChanged` 函数中,检查 `NMHDR` 结构体中的 `code` 字段,确定是否为 `LVN_ITEMCHANGED` 消息。 4. 确认该是否被选中,这可以通过 `NMLISTVIEW` 结构体中的 `uState` 和 `uNewState` 成员来判断。 5. 如果选中,使用 `SetItemState` 或者 `SetItemText` 等函数来设置的样式或颜色。 示例代码如下: ```cpp void CMyListCtrl::OnItemChanged(NMHDR *pNMHDR, LRESULT *pResult) { NMLISTVIEW *pNMLV = reinterpret_cast<NMLISTVIEW*>(pNMHDR); if (pNMLV->uChanged & LVIF_STATE && (pNMLV->uNewState & LVIS_SELECTED)) { // 设置选中项的背景和前景色 COLORREF crBk = RGB(255, 255, 0); // 黄色背景 COLORREF crText = RGB(0, 0, 0); // 黑色文字 // 设置选中项 m_ListCtrl.SetItemState(pNMLV->iItem, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); m_ListCtrl.SetTextColor(pNMLV->iItem, crText); m_ListCtrl.SetBkColor(crBk); } *pResult = 0; } ``` 在这个例子中,当用户选中某个列表项时,该项的背景色被设置为黄色,文字颜色被设置为黑色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值