none
关于OnMouseMove消息处理函数的问题 RRS feed

  • 问题

  •  

    看了技术内幕上的一个例子,绘制一个椭圆,然后在客户区内用鼠标拖动椭圆,里面为响应WM_MOUSEMOVE消息用到了OnMouseMove(UINT nFlags, CPoint point)函数.

     

    Code Snippet

    void Cex06a2View::OnMouseMove(UINT nFlags, CPoint point)
    {
       
    if(m_bCaptured)               //鼠标状态捕捉标志                       
        {
            CClientDC dc(
    this);
            OnPrepareDC(
    &dc);

            CRect rectOld(m_pointTopLeft,m_sizeRect);
            dc.LPtoDP(rectOld);

            InvalidateRect(rectOld,TRUE);           
    //重绘区域

            m_pointTopLeft
    = point - m_sizeOffset;   //计算新的外接矩形左上角坐标
            dc.DPtoLP(&m_pointTopLeft);

           
    CRect rectNew(m_pointTopLeft,m_sizeRect);
            dc.LPtoDP(rectNew);

            InvalidateRect(rectNew,TRUE);

        }
    }

     


    进行了2次无效区域的重绘,问题主要是最后三行代码,不明白最后三行代码进行第二次重绘的原因,实际测试中去掉最后三

     

    行代码后,程序可以正确运行,只是在用鼠标拖动椭圆和释放鼠标之后椭圆都会出现部分的缺角问题,哪位讲下最后三行代

     

    码再次进行无效区域重绘的意义以及缺角问题和它的联系

    2008年10月31日 17:05

答案

  • 你好!
       第一次重绘是为了抹掉上一次绘制的图形,第二次重绘是为了绘制一个新的图形,这样就可以模拟拖动的效果了:每次抹掉上一次绘制的图形,然后在绘制新的图形。
       希望你能理解这种方法,这在GDI编程中是常用的技巧,这样可以模拟动画的效果!
    2008年11月1日 7:23
    版主