我已经在CListView中实现了自画功能,已经画出了线,但是在原区域重画该线,改变该线的颜色,可总也改变不了,不知道是怎么回事?高手请指点!
CPen  Pen(PS_SOLID, 1, RGB(0,0,0)), *pOldPen;
CPen  Pen2(PS_SOLID, 1, RGB(255,0,0));
pOldPen = pDC->SelectObject(&Pen);
开始的时候已经画出来了.当满足一个条件要改变该线颜色,
pOldPen = pDC->SelectObject(&Pen2);当选择这个时往原来的地方再画一下,颜色还是黑色,为什么?

解决方案 »

  1.   

    void CDiameterLogWndOne::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    CListCtrl& m_ListCtrl = GetListCtrl(); 
    CString str,sTextTwo;
    CRect rcItem(lpDrawItemStruct->rcItem);
    CRect RectOne,RectTwo,RectThr,RectFour,RectFive,r;

    int nCount = m_RecvIP.size();
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    int nSavedDC = pDC->SaveDC();

    CPen  Pen(PS_SOLID, 1, RGB(0,0,0)), *pOldPen;
    CPen  Pen2(PS_SOLID, 1, RGB(255,0,0));
    pOldPen = pDC->SelectObject(&Pen);
    pDC->SelectStockObject(NULL_BRUSH); int nItem = lpDrawItemStruct->itemID;

    LVITEM item;
    ZeroMemory ( &item, sizeof(LVITEM) );
    item.iItem = nItem;
    item.iSubItem = 0;
    item.mask = LVIF_IMAGE|LVIF_STATE;
    item.stateMask = 0XFFFF; m_ListCtrl.GetItem(&item);
    BOOL bSelected = item.state&LVIS_SELECTED; COLORREF color=::GetSysColor(COLOR_WINDOW);

    DWORD dw = m_ListCtrl.GetItemData(nItem) ;

    DrawLine(pDC,m_ListCtrl,nItem,nCount,dw); DrawClickColor(pDC,m_ListCtrl,nItem,bSelected); ChangeLineColor(pDC,m_ListCtrl,nItem,dw); //draw arrow
    ARROWSTRUCT a;
    CBrush br1, br2, *pbrOld;

    br1.CreateSolidBrush(RGB(0,0,0));
    br2.CreateSolidBrush(RGB(255,0,0));
    pbrOld = pDC->SelectObject(&br1);
    //setup arrows
    a.nWidth = 10;
    a.fTheta = 0.5f;
    a.bFill = true; PaintArrow(pDC, m_ListCtrl,a,nCount);

    pOldPen = pDC->SelectObject(&Pen2);
    pbrOld = pDC->SelectObject(&br2);
    if(dw == ITEMCOLOR_CHANGE_ONE)
    {
    PaintArrowColor(pDC,m_ListCtrl,a,nCount,nItem);
    color=::GetSysColor(COLOR_HIGHLIGHT);
    }
    else
    {
    pDC->SetBkColor(color);
    pDC->SetTextColor(RGB(0,0,0));
    }
    }void CDiameterLogWndOne::DrawLine(CDC *pDC,CListCtrl &m_ListCtrl, int nItem,int nCount,int dw)
    {
    CRect RectOne,RectTwo,RectThr;
    CPen  Pen2(PS_SOLID, 1, RGB(255,0,0)),Pen(PS_SOLID, 1, RGB(0,0,0)), *pOldPen;


    m_ListCtrl.GetItemRect ( nItem, RectOne, LVIR_LABEL );
    CString sTextOne = m_ListCtrl.GetItemText ( nItem,  0);

    if(!sTextOne.IsEmpty() && sTextOne.GetLength() != 0)
    {
    pDC->DrawText(sTextOne,RectOne,DT_END_ELLIPSIS | DT_LEFT );
    }
    else
    {
    pDC->DrawText(_T(""),RectOne,DT_END_ELLIPSIS | DT_LEFT );
    } if(nItem > 1)
    {
    pDC->MoveTo(RectOne.left + LINE_VERTLINE, RectOne.top);
    pDC->LineTo(RectOne.left + LINE_VERTLINE, RectOne.bottom);
    }

    for(int i = 0 ; i < nCount ; i ++)
    {

    m_ListCtrl.GetSubItemRect(nItem,i+2,LVIR_LABEL,RectTwo);
    CString sText = m_ListCtrl.GetItemText ( nItem,  i+2);

    if(!sText.IsEmpty() && sText.GetLength() != 0)
    {
    pDC->DrawText(sText,RectTwo,DT_END_ELLIPSIS | DT_LEFT );
    }
    if(nItem > 1)
    {
    pDC->MoveTo(RectTwo.left + LINE_VERTLINE, RectTwo.top);
    pDC->LineTo(RectTwo.left + LINE_VERTLINE, RectTwo.bottom);
    }
    }


    m_ListCtrl.GetSubItemRect(nItem,1,LVIR_LABEL,RectThr);
    CString sTextTwo = m_ListCtrl.GetItemText ( nItem,  1);

    if(!sTextTwo.IsEmpty() && sTextTwo.GetLength() != 0)
    {
    pDC->DrawText(sTextTwo,RectThr,DT_END_ELLIPSIS | DT_CENTER );
    }
    for(i = 4 ; i < m_nCount ; i = i + 4)
    {
    m_ListCtrl.GetSubItemRect(i,1,LVIR_LABEL,RectThr);
    pDC->MoveTo(RectThr.left, RectThr.bottom);
    pDC->LineTo(RectThr.right,RectThr.bottom);
    }
    //draw line
    for(i = 4 ; i < m_nCount ; i = i + 4)
    {
    m_ListCtrl.GetSubItemRect(i,1,LVIR_LABEL,RectThr);
    pDC->MoveTo(RectThr.left, RectThr.bottom);
    pDC->LineTo(RectThr.right,RectThr.bottom);
    }

    }void CDiameterLogWndOne::ChangeLineColor(CDC *pDC, CListCtrl &m_ListCtrl, int nItem, int dw)
    {
    CRect RectThr;
    CString sTextTwo;
    CPen  Pen2(PS_SOLID, 1, RGB(255,0,0)), *pOldPen;
    COLORREF color=::GetSysColor(COLOR_WINDOW);

    if(dw == ITEMCOLOR_CHANGE)
    {
                      //change line color
    pOldPen = pDC->SelectObject(&Pen2);

    //pDC->SetBkColor(TRANSPARENT);
    m_ListCtrl.GetSubItemRect(nItem,1,LVIR_LABEL,RectThr);
    pDC->FillSolidRect(RectThr,RGB(255,255,255));

                      //in the same area draw red line,but not work?why?
    pDC->MoveTo(RectThr.left, RectThr.bottom);
    pDC->LineTo(RectThr.right,RectThr.top);


    pDC->SetBkColor(RGB(255,255,255));
    pDC->SetTextColor(RGB(255,0,0));

    m_ListCtrl.GetSubItemRect(nItem,1,LVIR_LABEL,RectThr);
    CString sTextTwo = m_ListCtrl.GetItemText ( nItem,  1);

    if(!sTextTwo.IsEmpty() && sTextTwo.GetLength() != 0)
    {
    pDC->DrawText(sTextTwo,RectThr,DT_END_ELLIPSIS | DT_CENTER );
    }
    color=::GetSysColor(COLOR_HIGHLIGHT);
    }
    else
    {
    pDC->SetBkColor(color);
    pDC->SetTextColor(RGB(0,0,0));
    } if(dw == ITEMCOLOR_CHANGE_TWO)
    {

    pDC->SetBkColor(RGB(255,255,255));
    pDC->SetTextColor(RGB(255,0,0));


    m_ListCtrl.GetSubItemRect(nItem,1,LVIR_LABEL,RectThr);

    sTextTwo = m_ListCtrl.GetItemText ( nItem,  1);

    if(!sTextTwo.IsEmpty() && sTextTwo.GetLength() != 0)
    {
    pDC->DrawText(sTextTwo,RectThr,DT_END_ELLIPSIS |  DT_CENTER );
    }
    color=::GetSysColor(COLOR_HIGHLIGHT);
    }
    else
    {
    pDC->SetBkColor(color);
    pDC->SetTextColor(RGB(0,0,0));
    }

    }代码在上面, Mackz请指教!