解决方案 »

  1.   

    如果 自绘在 Onpaint 中 ,那么 重绘区 不是 你 改变 rect 就 有效的, 重绘区 必须通过 InvalidateRect 来 产生。
      

  2.   

    非常感谢兄弟你能抽空来回答。是我没说明清楚,现在我全部的绘制都是在DrawItem里面写的,在OnEraseBkgnd里面直接进制刷新背景(之前在这个函数里重绘背景,但点击行时过个一秒闪烁,所以就没重绘背景了)。顺便问下用Invalidate不行么
      

  3.   

    GetHeaderCtrl()->Invalidate(); ?
      

  4.   

    drawitem?
    不熟悉呃~~~咱通常都是完全自绘重载WM_PAINT和WM_ERASEBKGND来做的,前者用CDC一点一线慢慢画(真的是从几何形状到文字格式啥的都一点一点自己做,外加双缓冲),后者直接返回。据咱所知,所有想把界面做的炫点却又得使用幼儿园级别基本控件的MFC的人都有过一些超麻烦的回忆!
      

  5.   

    这位兄弟,2楼说如果是在onpaint就要用InvalidateRect,你这问题我有点搞不懂。我用也是在ListCtrl类里面需要刷新的地方直接Invalidate(FALSE).
      

  6.   

    这位兄弟同感同感。
    我之前在CListCtrl里面一个Item就create一个button,button类型是checkbox,然后这些button里面添加事件,当时ClistCtrl风格是list,然后刷新的话用movewindow就行;后来我改ClistCtrl风格为report,滚动条滚动,表头拖动啊什么的都不行了。然后我这次做修改一下,风格report,drawitem自绘,双缓冲,表头自绘,checkbox的话用图标加载,最后说明下使用Unicode编码。
      

  7.   

    我的做法是
    在OnEraseBkgnd里,clientrect 抠掉item所在的区域,绘制背景
    这样既没有闪烁 也没有残影
      

  8.   

    这位兄弟思路正解,现在的控件拖动没残影了,随意拖,也没闪烁了。按照他的思路我的代码如下:
    //刷新背景
    BOOL CListCtrlEx::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CRect rcClient;
    CRect rcItem;
    CRect rcFill;

    //获取位置
    GetClientRect(&rcClient);
    GetItemRect(1, rcItem, LVIR_BOUNDS); if ((rcFill.left = rcItem.right) < rcClient.right)
    {
    rcFill.right  = rcClient.right;
    rcFill.top    = rcClient.top;
    rcFill.bottom = rcClient.bottom;

    //填充颜色
                       BufferCDC BufferDC(pDC, &rcFill);(注意BufferCDC是双缓冲的一个类)
    BufferDC->FillSolidRect(&rcFill, m_BackCorlor);//m_BackCorlor是背景颜色
                    //不用缓冲可直接
                       //pDC->FillSolidRect(&rcFill, m_BackCorlor);
    } return TRUE;
    }
    结贴给分