大家都知道,在图像处理软件中,“矩形选择”工具是必不可少的,因为很多图像处理的操作都是以选中部分的图像为处理对象的。 
    MFC中有CRectTrack类,可以实现橡皮矩形的功能,但是有以下几个缺点:
(1)屏蔽了WM_MOUSEMOVE,WM_LBUTTONUP消息,不好控制,例如实时显示当前矩形区域的宽、高。
(2)这样画出的矩形框是静态的,不能像photoshop那样:矩形4条边都在“流动”。
(3)不美观。
    我已经用CRectTrack实现了矩形选择,但是基于以上3点,想自己写个类似的类来实现。
应该有以下的功能要求:
【1】用鼠标动态绘制虚线矩形,鼠标UP后,矩形应呈“动态显示”。
【2】随图像一起,被拖动或者缩放。
【3】矩形应该是“橡皮矩形”,即可以在四个角、四条边上被拖拽缩放。『问题』
对于实现的原理和方法,各位有没有什么高见?请说得详细一些!
◎谢谢◎

解决方案 »

  1.   

    还是自己画吧
    感觉rect只是一个画图的工具
    绘图的信息保存起来,计算完了画出来就好了
      

  2.   

    继承?
    好想法
    但是怎么做才能弥补我所所说的CRectTracker的下面3个缺点呢?
    (1)屏蔽了WM_MOUSEMOVE,WM_LBUTTONUP消息,不好控制,例如实时显示当前矩形区域的宽、高。
    (2)这样画出的矩形框是静态的,不能像photoshop那样:矩形4条边都在“流动”。
    (3)不美观。
      

  3.   

    贴一段示例上的代码:void CClipSampView::MoveTrackRect(CPoint point)
    {
    //这个函数是绘制拖动时虚线矩形框,并可以移动对象位置功能的
        CClientDC dc(this);
        OnPrepareDC(&dc);
        dc.DrawFocusRect(m_rectTracker);//CRect m_rectTracker;
        dc.LPtoDP(m_rectTracker);
        CSize sizeTrack = m_rectTracker.Size();
        CPoint newTopleft = point - m_dragOffset;  // still device
        m_rectTracker = CRect(newTopleft, sizeTrack);
        m_tracker.m_rect = m_rectTracker;
        dc.DPtoLP(m_rectTracker);
        dc.DrawFocusRect(m_rectTracker);
    }
      

  4.   

    TO: Snow_Ice11111(雪上加冰)
    你上述方法就是自己重新设计一个trackerRect类么?
    那怎么让矩形动起来呢?
    算了,不说这些了。
    能不能给出一个一揽子解决方案呢?
      

  5.   

    只是用了大家提到的CRectTracker类对象m_tracker;
    代码来自《COM原理与应用》一书源代码中第9章的范例,它本来的知识点是讲剪贴板和拖、放的方面,不过,例子中的代码恰好有楼主要的功能。需要的话请留下邮箱,我给你发过去。
      

  6.   

    TO: Snow_Ice11111(雪上加冰)三点钟还不休息??哥们真是厉害啊!我得邮箱:[email protected]谢谢
      

  7.   

    重新设计类,不划算,太麻烦。
    还是继承来得快一些。
    但是我的问题,即对类CRectTracker得控制不完全了解:
    【1】类CRectTracker得拖动和缩放,全部在WM_LBUTTONDOWN里面实现,我怎么实时捕获当前矩形得大小(即绘制时和对矩形缩放时)。
    【2】像photoshop一样的使矩形“闪烁显示”。只要此二问题解决了,我的目的也就达到了。
      

  8.   

    http://www.vckbase.com/document/viewdoc/?id=235
      

  9.   

    Snow_Ice11111(雪上加冰)  的做法是对的。
      

  10.   

    TO:redjuly(凤凰木)
    你贴的那篇文章我看过,呵呵,不能满足我现在的要求。
      

  11.   

    看来继承也不行了。
    因为继承终究摆脱不了CRectTracker类的桎梏。如果要摆脱这些限制,那么将不得不抛弃此类中 的核心功能,而剩余的其他成员函数都比较简单,可以很快实现。
    所以,还是自己老老实实的重新写类吧!◎谢谢各位的指点跟启发◎
      

  12.   

    终于写出来了,但是
    【1】还不能像photoshop那样,以象素为单位来绘制矩形框。
    【2】图像被大幅度的缩放或者拖动时,矩形框位置和大小有变化,这是误差引起的,我想时我的方法,也就是计算位置和尺寸时,参照物不合适。若有做过这方面的工作的高人,能否指点一二。
    谢谢!
      

  13.   

    我做过。
    1。不是按矩形画的否则到任意形状就无法做了。
    2。其实是一个边界的mask.就像0.1。
    3。生成一个黑白小块相间的图,比如8*8。然后每次移动一个x.y各1。
    4。将1的位置用这个特殊图像填充。
    5。自己画,系统的mask函数非常慢(检查CPU Usage)具体有大量的优化才可以比较接近PhotoShop的速度。我的还有差距。
      

  14.   

    TO: buggycode(风雨寒夜)我们起初也想过这种方法,但不得要领。
    你上面的留言比较简略,
    能不能通过邮件,咱们详细的谈一下??我的邮件:
    [email protected]
    谢谢。