项目【MFC】(五)

您所在的位置:网站首页 鼠标拖动图标变成打开应用程序 项目【MFC】(五)

项目【MFC】(五)

2023-08-25 09:15| 来源: 网络整理| 查看: 265

初始状态:

拖动后:

 

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

 

实现思路:

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的仿射变换实现图像移动!

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3