项目【MFC】(五)-鼠标拖动实现图像移动

初始状态:

拖动后:

 

功能:点击按钮【移动图像】,然后鼠标放在图像显示区域,按下鼠标左键,鼠标移动,鼠标左键抬起实现图像拖动。

 

实现思路:

1、首先鼠标左键按下,获取起始点坐标;这个过程中需要判断鼠标是否放在图片显示控件上,若是才会响应事件!

2、然后鼠标移动,实际上在这里,这一步没有执行任何操作!

3、最后鼠标左键抬起,获取停止点坐标;这个过程中需要判断鼠标是否放在图片显示控件上,若是才会响应事件!

  • 获取停止点坐标后,就需要根据起始点坐标分别计算出x方向和方向的移动距离,然后根据移动距离即可实现图像平移移动。

注:鼠标点击事件中,它的形参是CPoint point,所以它的坐标是相对界面的,而不是相对电脑屏幕!!!所以呢,也需要把获取的图像显示区域的坐标转化为是相对界面的,加一句  ScreenToClient(rect);//转化为对话框上的相对位置    即可

代码:

  • 左键按下

//鼠标左键按下
void CTouch_test_CKV10Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	CRect rect;
	GetDlgItem(IDC_STATIC_IMG)->GetWindowRect(&rect);//获取MFC图像显示区域

	Point p(point.x, point.y);//opencv鼠标坐标(相对界面)
	ScreenToClient(rect);//转化为对话框上的相对位置
	Rect r(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);//opencv窗口显示区域
	if (!ROI_BOX){
		
		if (r.contains(p)) //鼠标放在图片窗口上
		{
				before_x = point.x;
				before_y = point.y;
		}
	}
	else{
		if (r.contains(p)) //鼠标放在图片窗口上
		{
			m_startRect = TRUE;   //鼠标左键单击,设置可以开始绘制矩形框
			m_startPoint = point; //记录开始点
			m_OldPoint = point;   //设置老点也为开始点
		}
	}

	CDialogEx::OnLButtonDown(nFlags, point);
}
  • 左键抬起

void CTouch_test_CKV10Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	CRect rect;
	GetDlgItem(IDC_STATIC_IMG)->GetWindowRect(&rect);//获取MFC图像显示区域
	ScreenToClient(rect);//转化为对话框上的相对位置
	Point p(point.x, point.y);//opencv鼠标坐标(相对界面)
	Rect r(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);//opencv窗口显示区域

	if (!ROI_BOX){
		if (r.contains(p)) //鼠标放在图片窗口上
		{
			current_x = point.x;
			current_y = point.y;

			tx = (current_x - before_x);
			ty = (current_y - before_y);
			if (MOVE){
				if (zoom){
					cv::Mat move_img;
					affine_trans_translation(resize_mat, move_img, tx, ty);
					//pre_zoom = true;
					imshow("view", move_img);
				}
				else{
					cv::Mat move_img;
					affine_trans_translation(current_img, move_img, tx, ty);
					//pre_zoom = true;
					imshow("view", move_img);
				}
			}
		}
		MOVE = false;
	}
else{
		if (r.contains(p)) //鼠标放在图片窗口上
		{
			m_startRect = FALSE; //重置绘制矩形框标志

			//消隐最后的一个矩形(其原理跟拖动时矩形框绘制原理相同)
			CClientDC dc(this);
			dc.SetROP2(R2_NOT);
			dc.SelectStockObject(NULL_BRUSH);
			dc.Rectangle(CRect(m_startPoint, m_OldPoint));

			roi_wighth = abs(m_startPoint.x - m_OldPoint.x);
			roi_height = abs(m_startPoint.y - m_OldPoint.y);

			roi_star_X = m_startPoint.x - rect.left - tx;
			roi_star_Y = m_startPoint.y - rect.top - ty;

			roi_end_X = m_OldPoint.x - rect.left - tx;
			roi_end_Y = m_OldPoint.y - rect.top - ty;
            INT_PTR nRes;
			// 显示消息对话框   
			CString fram_num;
			fram_num.Format(_T("%4d"), current_frame);
			nRes = MessageBox(_T("打开原始表格数据?"), _T("第") + fram_num + _T("帧"),     
            MB_YESNO | MB_ICONQUESTION);
			if (IDNO == nRes){

				pre_data = false;
			}
			if (IDYES == nRes){
				pre_data = true;
			}

			cv:waitKey(35);
			//DLA_Table list;//模态对话框
			//list.DoModal();
			DLA_Table *list = new DLA_Table; //非模态对话框
			list->Create(IDD_DIALOG_Table);
			list->ShowWindow(SW_SHOW);
		}		
	}
	CDialogEx::OnLButtonUp(nFlags, point);
}

注:这里实现的移动功能只有 if (!ROI_BOX){ }里面的语句会有效!后面的else可忽略~

另外,这里使用了opencv的仿射变换实现图像移动!

 

  • 5
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值