我用的单文档弄的小东西,创建了几个按钮,因为响应WM_MOUSEMOVE 每移动鼠标都要导致重绘 按钮的重绘都会一闪一闪的  怎么解决啊
……

解决方案 »

  1.   

    这个和双缓冲没有关系。你在更新视图时用Invalidate(FALSE)试试。
      

  2.   

    用一个BOOL型变量来标识你的光标是否在按钮上,如果第一次进入就重绘,如下。如果光标离开按钮也重绘。
    这样的按钮上移动时就不会闪烁了!
    void CTomButton::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    if (!m_bHover)
    {
    TRACKMOUSEEVENT tme;
    tme.cbSize = sizeof(TRACKMOUSEEVENT);
    tme.dwFlags = TME_LEAVE;
    tme.dwHoverTime = 10;
    tme.hwndTrack = this->GetSafeHwnd();
    ::_TrackMouseEvent(&tme); m_bHover = TRUE;
    Invalidate();
    } CButton::OnMouseMove(nFlags, point);
    }
    LRESULT CTomButton::OnMouseLeave(WPARAM,LPARAM)
    {
    if (m_bHover)
    {
    m_bHover = FALSE;
    Invalidate();
    } return 0L;
    }
      

  3.   

    想个办法,把按钮区域“挖”出来,不再绘制这片区域。
    设置剪裁区, 应该不用说得再详细了吧。
    矩形中减去你的按钮矩形,  新的region就是你的剪裁区。
      

  4.   

    看下这个吧,可能对你有帮助。
    http://topic.csdn.net/u/20090224/16/ec335984-771b-405f-a93e-b726daf1abce.html
      

  5.   

    你的view类设置WS_CLIPCHILDREN属性
      

  6.   

    给你的窗口设置WS_CLIPCHILDREN风格