希望实现类似 PHOTOSHOP 图片拖拉改变大小,移动图片功能,希望得到提示!!!

xjb2001 2008-08-27 04:39:39
我在多文档的 childview 中加载了 一个 图片

我现在想通过鼠标拉动图片来调整图片的大小(图片被点中后,会出现方框,拉方框上的点,可以调整图片大小),鼠标点住图片,就能实现图片的移动。

同样的,我也放了个 CShockwaveFlash 在上面,我也希望能实现拖拉改变大小和移动功能。


我现在没有实现上述功能的思路,希望能得到高人的提示。

我看到了MagaMaker这个软件,是直接在 flash 控件上实现的加载图片和flash文件?真不明白怎么做的?

我想做的东西,估计属于冷饭了,很多人都实现了的,我猜测是有控件可用的(希望如此)。

希望了解的朋友留下点提示吧。




...全文
1117 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
skinfeature 2008-08-31
  • 打赏
  • 举报
回复
http://www.skinfeature.com
laviewpbt 2008-08-28
  • 打赏
  • 举报
回复
为什么一个简单的功能就要用CXImage,哪个DLL可是1MB多啊,GDI+不好吗?
xsc2001 2008-08-28
  • 打赏
  • 举报
回复
用CImage来实现很容易的,用这个类主要是读取时方便,它支持bmp,jpg,gif等常见的大多数图片格式文件。
首先你得在你的视图中定义一个成员变量:
CImage m_img;//图片
CRect m_imgrect;//图片当前所在的位置区域

选择图片的操作在视图的OnLButtonDown里去实现,鼠标按下的时候通过判断当前点是否在m_imgrect里,如果是,就把图片绘制成选中状态,绘制函数如下:

CPoint pt1 = m_imgrect.TopLeft();//左上角点
CPoint pt2 = m_imgrect.BottomRight();//右下角点
CBrush brush;
brush.CreateSolidBrush(RGB(255, 0, 0));
CBrush* pOldBrush = pDC->SelectObject(&brush);

//矩形上边中间的那个小方框
pDC->Rectangle(CRect(pt1.dx + (pt2.dx - pt1.dx) / 2 - 4, pt1.dy - 4, pt1.dx + (pt2.dx - pt1.dx) / 2 + 4, pt1.dy + 4));
//矩形底边上那个小方框
pDC->Rectangle(CRect(pt1.dx + (pt2.dx - pt1.dx) / 2 - 4, pt2.dy - 4, pt1.dx + (pt2.dx - pt1.dx) / 2 + 4, pt2.dy + 4));
//矩形左边上那个小方框
pDC->Rectangle(CRect(pt1.dx - 4, pt1.dy + (pt2.dy - pt1.dy) / 2 - 4, pt1.dx + 4, pt1.dy + (pt2.dy - pt1.dy) / 2 + 4));
//矩形右边上那个小方框
pDC->Rectangle(CRect(pt2.dx - 4, pt1.dy + (pt2.dy - pt1.dy) / 2 - 4, pt2.dx + 4, pt1.dy + (pt2.dy - pt1.dy) / 2 + 4));

//矩形右上角那个小方框
pDC->Rectangle(CRect(pt2.dx - 4, pt1.dy - 4, pt2.dx + 4, pt1.dy + 4));
//矩形右下角那个小方框
pDC->Rectangle(CRect(pt2.dx - 4, pt2.dy - 4, pt2.dx + 4, pt2.dy + 4));
//矩形左上角那个小方框
pDC->Rectangle(CRect(pt1.dx - 4, pt1.dy - 4, pt1.dx + 4, pt1.dy + 4));
//矩形左下角那个小方框
pDC->Rectangle(CRect(pt1.dx - 4, pt2.dy - 4, pt1.dx + 4, pt2.dy + 4));

pDC->SelectObject(pOldBrush);

上面是在选中状态下绘制控制拉大的和放小的控制块。

而如果已经选中了,则在鼠标按下时则去判断鼠标是在上面的那个小控制块里,再在OnMousemove里进行判断,根据图片的选中状态和所在不同的控制块进行相应操作:

switch(m_nSizeFlag)//判断控制块的标志
{
case ALL_MOVE://移动
pt1.dx -= dx;
pt1.dy -= dy;
pt2.dx -= dx;
pt2.dy -= dy;
break;
case TOP_MIDDLE:
pt1.dy -= dy;
break;
case BOTTOM_MIDDLE:
pt2.dy -= dy;
break;
case LEFT_MIDDLE:
pt1.dx -= dx;
break;
case RIGHT_MIDDLE:
pt2.dx -= dx;
break;
case TOP_LEFT:
pt1.dx -= dx;
pt1.dy -= dy;
break;
case TOP_RIGHT:
pt1.dy -= dy;
pt2.dx -= dx;
break;
case BOTTOM_LEFT:
pt1.dx -= dx;
pt2.dy -= dy;
break;
case BOTTOM_RIGHT:
pt2.dx -= dx;
pt2.dy -= dy;
break;
}
m_imgrect.top = pt1.y;
m_imgrect.left = pt1.x;
m_imgrect.bottom = pt2.y;
m_imgrect.right = pt2.x;


而对于图片的绘制如下:

int nPreMode = pDC->SetStretchBltMode(COLORONCOLOR);
m_pImage->Draw(pDC->GetSafeHdc(), m_imgrect.left, m_imgrect.top, m_imgrect.Width(), m_imgrect.Height(),
0, 0, m_pImage->GetWidth(), m_pImage->GetWidth());
pDC->SetStretchBltMode(nPreMode);
zhucde 2008-08-28
  • 打赏
  • 举报
回复
1. 建议使用Cx_Image免费的图像库, 用它是为了实现图像的显示和缩放( 缩放不能单纯的使用StrethcDIBits, 会变形,需要重新调整其像素), 而如果移动和缩放,这是另外一圆回事, 你可以想象它是任何控件件, 移动控件, 很简单吧, 缩放也不复杂, 甚至都可以使用MoveWindow来实现, 移动和缩放此控件后, 重新调用图像库的显示和缩放来更新图像.
现在问题重点就回到了使用鼠标来移动控件和缩放上, 这个自己想吧, 基础问题

2. COM/ActiveX
laviewpbt 2008-08-28
  • 打赏
  • 举报
回复
GDI+中的graphics.drawimage 有一种重载函数可以绘制旋转,变形(仅仅限于平行四边形的变形)后的图像,这个可以做个简单的PS。
xjb2001 2008-08-28
  • 打赏
  • 举报
回复
研究了下 cximage ,那这个来实现我需要的功能,是在大材小用了

唯一的好处就是能实现无损的图像缩放。
xjb2001 2008-08-28
  • 打赏
  • 举报
回复
谢谢 回复

基于 图片的 旋转和缩放,可以想办法做的,大不了自己写一个控件,相信这不是最麻烦的。

但是,基于 flash 的 拖拉缩放和移动,就麻烦了,CShockwaveFlash 并没有提供我们需要的消息映射,难道用 HOOK 去抓 FLASH 上的消息,这有点夸张了吧。

而且,怎么去拖拉flash修改大小,我找了很久也没看到相关的接口。






cnzdgs 2008-08-27
  • 打赏
  • 举报
回复
可以自己从CStatic或者从CWnd派生一个类,把每张图片做成一个控件,把与图片有关的功能都在这个类里面实现。图片选中后将控件风格加入边框,取消选中后去掉边框;响应WM_NCHITTEST消息,判断鼠标在客户区内时返回HTCAPTION,可实现拖动;响应WM_PAINT消息,根据需要刷新的区域用StretchDIBits贴图可以实现缩放,如果觉得效率底可以先把图片载入内存DC,刷新时用BitBlt贴图。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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