上一篇:
[图像处理] MFC载入图片并进行二值化处理和灰度处理及其效果显示
文章目录
- 前言
- 完整代码
- 重要代码
- 效果
前言
上一篇实现了MFC通过Picture控件载入图片。
这一篇实现ROI功能的第一部分,在Picture控件中,通过鼠标拖拽画出一个矩形。
完整代码
MFC简单的图片处理工程-Gitee
重要代码
鼠标左键按下事件,记录左键按下时的坐标。
void CGDITESTDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
ClientToScreen(&point);
GetDlgItem(IDC_PIC_DISPLAY)->GetWindowRect(&rc_dsp);
if (rc_dsp.PtInRect(point)) //判断鼠标左键落下时,point是否在控件的rect范围内
{
m_startPt = point;
}
CDialogEx::OnLButtonDown(nFlags, point);
}
鼠标左键抬起事件,记录左键抬起时的坐标,并在Picture控件的DC中绘制矩形
void CGDITESTDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
CRect rect;
int rect_width = 0;
int rect_height = 0;
CPoint sel_pos;
//GetCursorPos(&sel_pos);
ClientToScreen(&point);
GetDlgItem(IDC_PIC_DISPLAY)->GetWindowRect(&rc_dsp);
if (rc_dsp.PtInRect(point) && m_IsChoose)//判断鼠标左键抬起时,point是否在控件的rect范围内
{
//ClipCursor(&rc_dsp);
//计算ROI的topleft和rightbottom坐标
if(point.x > m_startPt.x)
m_endPt.x = point.x < rc_dsp.right? point.x:rc_dsp.right;
else
m_endPt.x = point.x > rc_dsp.left ? point.x : rc_dsp.left;
if (point.y > m_startPt.y)
m_endPt.y = point.y < rc_dsp.bottom ? point.y : rc_dsp.bottom;
else
m_endPt.y = point.y > rc_dsp.top ? point.y : rc_dsp.top;
#if 1
CPoint tplt, rtbt;
tplt.x = m_startPt.x < m_endPt.x ? m_startPt.x : m_endPt.x;
tplt.y = m_startPt.y < m_endPt.y ? m_startPt.y : m_endPt.y;
rtbt.x = m_startPt.x > m_endPt.x ? m_startPt.x : m_endPt.x;
rtbt.y = m_startPt.y > m_endPt.y ? m_startPt.y : m_endPt.y;
m_ctl_pic_dsp.ScreenToClient(&tplt);
m_ctl_pic_dsp.ScreenToClient(&rtbt);
CDC* pDC = m_ctl_pic_dsp.GetWindowDC();
CPen pen(PS_SOLID, 1, RGB(255,0,0));
pDC->SelectStockObject(NULL_BRUSH);
pDC->SelectObject(&pen);
pDC->Rectangle(CRect(tplt, rtbt));
#else
//这里我本想在获取ROI的框选坐标后,通过dlg的OnPaint()函数来画矩形
// 所以使用了以下两个函数激活OnPaint()
// 但是却无法在picture控件上画矩形
// 百度了一下,原因是要在picture控件的dc中画,而不是在dialog的dc中画。
//Invalidate(); //清空窗口的客户区,激活OnPaint()
//SendMessage(WM_PAINT); //激活OnPaint()
#endif
}
CDialogEx::OnLButtonUp(nFlags, point);
}