重绘后的CListCtrl每个单元格都有不同的背景色,当拖动列宽时,会出现白色痕际,随之又恢复背景色,请问有没有办法去除拖动过程中出现的那种白色现象?

解决方案 »

  1.   

    那是因为ListCtrl窗口用白色画刷清除了一下背景,所以可以在WM_ERASEBKND里直接return true;就可以避免清除背景,这样就不会有白色痕际。
      

  2.   

    那个WM_ERASEBKND不行呀,反回TRUE后还是一样的,而且非数据项区还不能刷新了
      

  3.   

    *pResult = 0;
    LPNMLVCUSTOMDRAW lpvcd = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
    if(CDDS_PREPAINT == lpvcd->nmcd.dwDrawStage)
    {
    *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if(CDDS_ITEMPREPAINT == lpvcd->nmcd.dwDrawStage)
    {
    if(1 == lpvcd->nmcd.dwItemSpec)
    {
    CRect rect;
    CListCtrl &list = GetListCtrl();
    list.GetItemRect(lpvcd->nmcd.dwItemSpec, &rect, LVIR_BOUNDS);
    rect.DeflateRect(0, 1, 0, 1);
    CDC *pdc = list.GetDC();
    CMemDC memdc(*pdc, this);
    CDC &dc = memdc.GetDC(); CBrush brush;
    brush.CreateSolidBrush(RGB(0x99, 0x99, 0x0));
    dc.FillRect(&rect, &brush);
    CString str;
    str = list.GetItemText(lpvcd->nmcd.dwItemSpec, 0);
    dc.SetBkMode(TRANSPARENT);
    dc.DrawText(str, &rect, 0);
    brush.DeleteObject();
    pdc->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dc, rect.left, rect.top, SRCCOPY);
    ReleaseDC(&dc);
    ReleaseDC(pdc);
    *pResult = CDRF_SKIPDEFAULT;
    return;
    }

    *pResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    else if((CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM) == lpvcd->nmcd.dwDrawStage)
    {
    if(3 == lpvcd->iSubItem)
    {
    lpvcd->clrText = RGB(0xcc, 0, 0);
    //lpvcd->clrTextBk = RGB(0x99, 0x99, 0x0);
    }
    *pResult = CDRF_DODEFAULT;
    }