初始状态:
拖动后:
功能:点击按钮【移动图像】,然后鼠标放在图像显示区域,按下鼠标左键,鼠标移动,鼠标左键抬起实现图像拖动。
实现思路:
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的仿射变换实现图像移动!