初始状态:
效果:
功能:按下按钮【局部框选】,然后鼠标左键按下,拖动鼠标,图像上会画出矩形,鼠标左键抬起,会弹出提示框(提醒是否打开原始表格数据),选择后会弹出相应的数据进行显示。
实现:
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);
}
- 表格数据显示
使用的是列表控件~