如何在view中动态画出一个能动的矩形选择区域,就像photoshop中“虚线框”工具一样!????

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

『问题』
对于实现的原理和方法,各位有没有什么高见?请说得详细一些!
◎谢谢◎
...全文
1066 21 打赏 收藏 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
collay 2006-09-04
  • 打赏
  • 举报
回复
短信?
老兄,会累死人的。
邮件不方便么?
buggycode 2006-09-02
  • 打赏
  • 举报
回复
用短信吧?
collay 2006-09-01
  • 打赏
  • 举报
回复
终于写出来了,但是
【1】还不能像photoshop那样,以象素为单位来绘制矩形框。
【2】图像被大幅度的缩放或者拖动时,矩形框位置和大小有变化,这是误差引起的,我想时我的方法,也就是计算位置和尺寸时,参照物不合适。

若有做过这方面的工作的高人,能否指点一二。
谢谢!
collay 2006-09-01
  • 打赏
  • 举报
回复
TO: buggycode(风雨寒夜)

我们起初也想过这种方法,但不得要领。
你上面的留言比较简略,
能不能通过邮件,咱们详细的谈一下??

我的邮件:
collays@163.com
谢谢。
buggycode 2006-09-01
  • 打赏
  • 举报
回复
我做过。
1。不是按矩形画的否则到任意形状就无法做了。
2。其实是一个边界的mask.就像0.1。
3。生成一个黑白小块相间的图,比如8*8。然后每次移动一个x.y各1。
4。将1的位置用这个特殊图像填充。
5。自己画,系统的mask函数非常慢(检查CPU Usage)

具体有大量的优化才可以比较接近PhotoShop的速度。我的还有差距。
navyly 2006-08-26
  • 打赏
  • 举报
回复
Snow_Ice11111(雪上加冰) 的做法是对的。
redjuly 2006-08-26
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=235
collay 2006-08-26
  • 打赏
  • 举报
回复
重新设计类,不划算,太麻烦。
还是继承来得快一些。
但是我的问题,即对类CRectTracker得控制不完全了解:
【1】类CRectTracker得拖动和缩放,全部在WM_LBUTTONDOWN里面实现,我怎么实时捕获当前矩形得大小(即绘制时和对矩形缩放时)。
【2】像photoshop一样的使矩形“闪烁显示”。

只要此二问题解决了,我的目的也就达到了。
collay 2006-08-26
  • 打赏
  • 举报
回复
TO: Snow_Ice11111(雪上加冰)

三点钟还不休息??哥们真是厉害啊!

我得邮箱:collays@163.com

谢谢
mgdcs 2006-08-26
  • 打赏
  • 举报
回复
感兴趣,就是不会啊
collay 2006-08-26
  • 打赏
  • 举报
回复
看来继承也不行了。
因为继承终究摆脱不了CRectTracker类的桎梏。如果要摆脱这些限制,那么将不得不抛弃此类中 的核心功能,而剩余的其他成员函数都比较简单,可以很快实现。
所以,还是自己老老实实的重新写类吧!

◎谢谢各位的指点跟启发◎
Snow_Ice11111 2006-08-26
  • 打赏
  • 举报
回复
只是用了大家提到的CRectTracker类对象m_tracker;
代码来自《COM原理与应用》一书源代码中第9章的范例,它本来的知识点是讲剪贴板和拖、放的方面,不过,例子中的代码恰好有楼主要的功能。需要的话请留下邮箱,我给你发过去。
collay 2006-08-26
  • 打赏
  • 举报
回复
TO:redjuly(凤凰木)
你贴的那篇文章我看过,呵呵,不能满足我现在的要求。
collay 2006-08-25
  • 打赏
  • 举报
回复
TO: Snow_Ice11111(雪上加冰)
你上述方法就是自己重新设计一个trackerRect类么?
那怎么让矩形动起来呢?
算了,不说这些了。
能不能给出一个一揽子解决方案呢?
Snow_Ice11111 2006-08-25
  • 打赏
  • 举报
回复
贴一段示例上的代码:

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);
}
collay 2006-08-25
  • 打赏
  • 举报
回复
继承?
好想法
但是怎么做才能弥补我所所说的CRectTracker的下面3个缺点呢?
(1)屏蔽了WM_MOUSEMOVE,WM_LBUTTONUP消息,不好控制,例如实时显示当前矩形区域的宽、高。
(2)这样画出的矩形框是静态的,不能像photoshop那样:矩形4条边都在“流动”。
(3)不美观。
redjuly 2006-08-25
  • 打赏
  • 举报
回复
还是自己画吧
感觉rect只是一个画图的工具
绘图的信息保存起来,计算完了画出来就好了
菜牛 2006-08-25
  • 打赏
  • 举报
回复
从CRectTracker继承
powerbamboo 2006-08-25
  • 打赏
  • 举报
回复
不断的擦除和重绘,擦除只要画一根反线就可以了
collay 2006-08-25
  • 打赏
  • 举报
回复
哥们,
能不能说得详细一些啊?
加载更多回复(1)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧