我在按钮客户区边缘画了一个边框,我发现我调用Invalidate的时候边框无法消除,我是用一个条件来绘制边框的,调用Invalidate的时候应该是没有去绘制边框
没分了。。就这么点请大家见谅

解决方案 »

  1.   

    贴代码。InvalidateRect基本就是重新绘制的意思:使某一区域无效,重新绘制。还要看你代码是怎么写的。
      

  2.   

    又开一贴。真的是Invalidate没效果?试试Invalidate();UpdateWindow();
      

  3.   

    if (ST_MOUSEDOWN == m_DrawState)//按下按钮,绘制反向矩形框
    {
    pDC->Draw3dRect(rcDraw,GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
    }
    else//未按下按钮,绘制正常矩形框
    {
    if(ST_MOVEIN == m_DrawState || ST_MOUSEUP == m_DrawState)
    {
    pDC->Draw3dRect(rcDraw,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));
    }
    }
    LRESULT CTransParentButton::OnMouseLeave(WPARAM wParam,LPARAM lParam)
    {
    m_bTracking = false;
    m_DrawState=ST_MOVEOUT;
    InvalidateEx();
    return 0;
    }
    rcDraw区域是自绘函数中的lpDrawItemStruct->rcItem;
      

  4.   

    单由上面代码,能确定一定是 Invalidate出错?
      

  5.   

    InvalidateEx();不认识。
    换成Invalidate();UpdateWindow();呢?
      

  6.   

    如果在Invalidate前面加入如下代码 边框就会消失CRect rect;
    GetWindowRect(rect);
    GetParent()->ScreenToClient(rect);
    GetParent()->InvalidateRect(rect);
      

  7.   

    ST_MOVEOUT,ST_MOVEIN,ST_MOUSEUP,ST_MOUSEDOWN这些逻辑对了吗?加TRACE语句看看。
      

  8.   

    没有错,因为
    如果在Invalidate前面加入如下代码 边框就会消失CRect rect;
    GetWindowRect(rect);
    GetParent()->ScreenToClient(rect);
    GetParent()->InvalidateRect(rect);
      

  9.   

    RedrawWindow试试。黔驴技穷了。
      

  10.   

    刷新的话只会重新draw,你看看你的画边框是在哪个函数里实现的
      

  11.   

    对的。。就是DrawItem 很奇怪啊,为什么会消除不掉边框。。
      

  12.   

    再明确下,不是消除不掉边框。而是Invalidate时DrawItem没有响应对吧。
      

  13.   

    我觉得不是,因为如果我在DrawItem中添加代码,可以实现再画一个边框覆盖上原来的边框
      

  14.   

    哎,你的函数没有触发你的DrawItem函数,你跟踪看看
      

  15.   


    背景是图片。。问题就是invalidate没有清除掉边框
      

  16.   

    问题解决了,我修改了我的类,问题出在invalidate的刷新区域和不刷背景时,调用invalidate对于没有重绘的地方是不会清除掉的。
    我把所有绘图都放于兼容DC中,最后拷贝给目标DC;不过最先要创建个DC把背景拷贝下来,复制给兼容DC
    谢谢大家的指导,结贴了!!