RT.
CListCtrl选中一行后会高亮显示,不过一旦失去焦点,就不再高亮显示了。需求:始终高亮显示选中的行。如何通过重载OnNMCustomdraw()函数实现呢?

解决方案 »

  1.   

    有属性的。LVS_SHOWSELALWAYS , 创建的时候指定就可以了。
      

  2.   

    void CxxxxDlg::OnCustDrawList(NMHDR *pNMHDR,LRESULT *pResult)
    {
    // TODO: Add your message handler code here and/or call default
    *pResult=CDRF_NOTIFYITEMDRAW ;
    LPNMLVCUSTOMDRAW pDraw=(LPNMLVCUSTOMDRAW)pNMHDR;
    DWORD dwDrawStage=pDraw->nmcd.dwDrawStage;
    int nID=pDraw->nmcd.dwItemSpec;//
    int selID=m_List.GetNextItem(-1,LVNI_SELECTED);
    int subItem=pDraw->iSubItem;
    //
    if((nID==selID) && (subItem==0))
    { // afxDump << selID << ";" << subItem <<"\n";
    CDC* pdc=CDC::FromHandle(pDraw->nmcd.hdc);
    //
    CRect rc;
    m_List.GetItemRect(selID,&rc,LVIR_LABEL);
    CString txt=m_List.GetItemText(selID,0);
    //
    CSize sz=pdc->GetOutputTextExtent(txt);
    rc.right=rc.left+sz.cx+8;
    rc.DeflateRect(1,1);
    //
    DWORD clr=GetSysColor(COLOR_HIGHLIGHT);
    pdc->FillSolidRect(&rc,clr);
    //
    pdc->SetTextColor(RGB(255,255,255));//white
    pdc->SetBkColor(clr);
    //
    pdc->TextOut(rc.left,rc.top,txt);
    *pResult |= CDRF_SKIPDEFAULT;
    }
    }
      

  3.   

    乖乖。都是用的这个方法啊,连text都要通过DC自己再绘制。
    很郁闷的说按现在用的就是这个方法,觉得不太舒服,想讨个别的好法。。还有么?
    不过还是谢谢的说。结贴时候给你高分。 ;-)
      

  4.   

    我本来的想法是通过对每个单元格进行背景自绘,文字不做处理。就是:
    1、获取单元格rect
    2、绘制一个矩形透明的,着底色这样子单元格内的text不做任何处理,还是交给CListCtrl的OnLvnGetdispinfo处理.这个方法可行么?
      

  5.   

    搞个隐藏的CStatic,自己设置背景色和前景色,当CListCtrl有选择项并且失去焦点的时候,一个Item中的某一列就显示一个CStatic,有几列就显示几个,当然上面的文本,你可以通过CListCtrl::GetItemText();得到某行某列的数据。
      

  6.   

    本帖最后由 xianglitian 于 2010-07-16 10:14:35 编辑