项目MFC总结(七)——实现鼠标框选图像局部,显示数据

初始状态:

效果:

 功能:按下按钮【局部框选】,然后鼠标左键按下,拖动鼠标,图像上会画出矩形,鼠标左键抬起,会弹出提示框(提醒是否打开原始表格数据),选择后会弹出相应的数据进行显示。

 

实现:

 1、左键按下,获取开始点(绘制矩形框的起始点);

 2、鼠标移动,绘制矩形框

 3、鼠标抬起,消隐最后一个矩形框,显示消息对话框。

4、选择消息对话框的提示,然后显示数据!

 

代码:

  • 左键按下
//鼠标左键按下
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::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	MOVE = true;
	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)) //鼠标放在图片窗口上
		{
			HCURSOR hCur = LoadCursor(NULL, IDC_CROSS);
			::SetCursor(hCur);

			CClientDC dc(this);   //获取设备句柄
//SetRop2 Specifies the new drawing mode.(MSDN)
			//R2_NOT   Pixel is the inverse of the screen color.(MSDN)
			//即:该函数用来定义绘制的颜色,而该参数则将颜色设置为原屏幕颜色的反色
			//这样,如果连续绘制两次的话,就可以恢复原来屏幕的颜色了(如下)
			//但是,这里的连续两次绘制却不是在一次消息响应中完成的
			//而是在第一次拖动响应的绘制可以显示(也就是看到的),第二次拖动绘制实现擦出(也就看不到了)
			dc.SetROP2(R2_NOT);   //此为关键!!!
			dc.SelectStockObject(NULL_BRUSH); //不使用画刷
			if (TRUE == m_startRect)   //根据是否有单击判断是否可以画矩形
			{
				dc.Rectangle(CRect(m_startPoint, m_OldPoint));
				dc.Rectangle(CRect(m_startPoint, point));
				m_OldPoint = point;
			}
		}
		
	}
		
	CDialogEx::OnMouseMove(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);
}

 

  • 表格数据显示

使用的是列表控件~

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值