我程序有个弹出菜单,不管选中其某项还是不选中,菜单消失后,菜单原来遮住的那部分就会呈白色.这种情况怎么处理呢?程序相关内容:
(1)这个菜单是在CTreeView上面弹出的.
(2)由于软件使用了皮肤,所以弹出菜单采用TrackSkinPopupMenu.我现在怀疑跟以上两点有关系,就是不知道该怎么处理.因为一般弹出的菜单是不会存在重绘的问题的.

解决方案 »

  1.   

    在TrackSkinPopupMenu后调用一下Invalidate看看能不能解决问题
      

  2.   

    InvalidateRect+updatewindow就可以了
      

  3.   

    我最先想到的也是楼上两位的方法,可是..不管用.不知道弹出菜单有没有类似WM_DESTROY之类的消息,如果有的话就可以在处理消息的时候发送Invalidate.
      

  4.   

    补充一下:
    如果在某菜单项的处理函数里面调用Invalidate是有效的,可以擦除空白.
    如果不是点在菜单项上使菜单消失(点击菜单外面),这种情况在哪儿调用Invalidate呢?
      

  5.   

    在TrackSkinPopupMenu之后PostMessage
    做一个自定义消息调用Invalidate
      

  6.   

    程序中本身有响应鼠标左键的消息.但是我发现菜单弹出后,第一次点击空白时,并不能捕捉到鼠标左键消息,只有在这之后菜单消失了,再点击,才能捕捉到左键.消息做了,消息响应没问题,但是还是不见效哦
    LRESULT CLeftView::OnMM(WPARAM wParam,LPARAM lParam)
    {
    Invalidate();
    UpdateWindow(); return 0;
    }
      

  7.   


    请问一下,在TrackSkinPopupMenu之后直接调用Invalidate跟通过消息调用Invalidate有什么区别吗?
      

  8.   

    如果直接调用Invalidate就还没出原消息函数
    PostMessage会立即返回然后将一个消息送入队列
    原消息函数会结束
    然后可能会执行其它消息直到执行到PostMessage的消息才执行它
      

  9.   


    就是说直接调用Invalidate产生的消息不一定马上处理?是这个意思吧,但是后面接着调用UpdateWindow不是应该立即引发处理该消息了吗,难道不是这样的?我现在用消息的方式解决这个问题了,不同之处就是,给MainFrame自定义消息,然后由MainFrame调用LeftView的Invalidate...,这样就可以实现立即重绘. 真是奇怪,,用leftview自定义消息怎么就不行呢?