分享

CListCtrl如何在失去焦点后行仍高亮显示

 源码无限 2012-03-27
//只能用于一行,多行的话你改改
void CtestDlg::OnNMKillfocusList(NMHDR *pNMHDR, LRESULT *pResult)
{
   
// TODO: 在此添加控件通知处理程序代码
    i = m_DownLogListCtrl.GetSelectionMark();
    m_DownLogListCtrl.SetItemState(i, LVIS_DROPHILITED, LVIS_DROPHILITED);

   
*pResult = 0;
}

void CtestDlg::OnNMSetfocusList(NMHDR *pNMHDR, LRESULT *pResult)
{
   
// TODO: 在此添加控件通知处理程序代码
   
//UINT nState=m_DownLogListCtrl.GetItemState(i,LVIF_STATE);  
   
//nState&=!nState;  
    m_DownLogListCtrl.SetItemState(i, FALSE, LVIF_STATE);
   
*pResult = 0;
}

指定改变listctrl中某一行的颜色  

2007-02-15 15:50:51|  分类: vc.net |  标签: |字号 订阅

指定改变listctrl中某一行的颜色,比如说刚添加进去的一行,让它改变颜色,这样记录多了,容易看到自己刚刚加如的行,方便操作可查看,也可以让添加和修改的记录显示不一样的颜色,方便的多了,VC自带的没有这种功能。

1.  首先从ClistCtrl 继承一个类,命名为CmyListCtrlNew

在头文件中加摸板

CMap<DWORD , DWORD& , COLORREF , COLORREF&> MapItemColor;

好在这里查找你的修改的颜色。

2.  自己写个消息映射,可能添加不上,要自己写。

   BEGIN_MESSAGE_MAP(CMyListCtrlNew, CListCtrl)

    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)

//    ON_WM_SIZE()

END_MESSAGE_MAP()

OnNMCustomdraw 为实现函数。

3.  写OnNMCustomdraw函数。

   void CMyListCtrlNew::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)

{

    // TODO: Add your control notification handler code here

    *pResult = CDRF_DODEFAULT;

    NMLVCUSTOMDRAW * lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;

    NMCUSTOMDRAW &nmcd = lplvdr->nmcd;

    switch(lplvdr->nmcd.dwDrawStage)//判断状态

        {

            case CDDS_PREPAINT:

           {

               *pResult = CDRF_NOTIFYITEMDRAW;

               break;

           }

               case CDDS_ITEMPREPAINT://如果为画ITEM之前就要进行颜色的改变

           {

               COLORREF ItemColor;

               if(MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))

//根据在SetItemColor(DWORD iItem, COLORREF color) 设置的//ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。

               {

                   //lplvdr->clrText = RGB(0,0,0);//ItemColor;

                   lplvdr->clrTextBk = ItemColor;

                   *pResult = CDRF_DODEFAULT;

               }

           }

           break;

 

 

    }

 

 

}

4.  修改指定一行的颜色。

   void CMyListCtrlNew::SetItemColor(DWORD iItem, COLORREF color)

{

 

    //    m_iCurrentItem = iItem;

    //    m_CurrentColor = color;

    MapItemColor.SetAt(iItem, color);//设置某行的颜色。

    this->RedrawItems(iItem, iItem);//重新染色

    //this->SetCheck(iItem,1);

    this->SetFocus();//设置焦点

    UpdateWindow();

   

}

5.  修改全部行的颜色。

void CMyListCtrlNew::SetAllItemColor(DWORD iItem,COLORREF TextBkColor)

{

    //INT_PTR ncount = this->GetItemCount();

    if(iItem > 0)

    {

            for(DWORD numItem = 0; numItem < iItem ;numItem ++)

            {

               //iItem = i;

               MapItemColor.SetAt(numItem, TextBkColor);

               this->RedrawItems(numItem, numItem);

            }

    }

    return;

      

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多