在mfc里面,选择一个图片,针对图片在picture control里面,通过鼠标拖出矩形,然后将矩形的4个参数自动记录下来,具体步骤是什么
时间: 2023-05-28 18:06:01 浏览: 205
以下是实现步骤:
1. 在对话框中添加一个Picture Control控件,用于显示图片。
2. 在对话框的消息映射中添加以下代码,以便在图片控件中显示所选的图片:
```
CFileDialog dlg(TRUE, _T(".bmp"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, _T("Bitmap Files (*.bmp)|*.bmp|JPEG Files (*.jpg)|*.jpg|PNG Files (*.png)|*.png|All Files (*.*)|*.*||"), this);
if (dlg.DoModal() == IDOK) {
CString strFilePath = dlg.GetPathName();
CImage img;
img.Load(strFilePath);
CRect rect;
m_picture.GetClientRect(&rect);
img.StretchBlt(m_picture.GetDC()->m_hDC, rect);
}
```
其中,m_picture是控件的变量名,用于获取控件句柄。
3. 在对话框的消息映射中添加以下代码,以便在图片控件中拖出矩形框:
```
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bDrawRect = TRUE;
m_ptStart = point;
m_ptEnd = point;
m_rect.SetRectEmpty();
m_picture.ClientToScreen(&m_rect);
ScreenToClient(&m_rect);
m_picture.Invalidate(); // 重绘控件
CDialogEx::OnLButtonDown(nFlags, point);
}
void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bDrawRect) {
m_ptEnd = point;
m_rect.SetRect(m_ptStart, m_ptEnd);
m_picture.ClientToScreen(&m_rect);
ScreenToClient(&m_rect);
m_picture.Invalidate(); // 重绘控件
}
CDialogEx::OnMouseMove(nFlags, point);
}
void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bDrawRect = FALSE;
m_ptEnd = point;
m_rect.SetRect(m_ptStart, m_ptEnd);
m_picture.ClientToScreen(&m_rect);
ScreenToClient(&m_rect);
m_picture.Invalidate(); // 重绘控件
CDialogEx::OnLButtonUp(nFlags, point);
}
void CMyDlg::OnPaint()
{
CPaintDC dc(this);
if (!m_rect.IsRectEmpty() && m_rect.Width() > 0 && m_rect.Height() > 0) {
CBrush brush(RGB(0, 255, 0));
dc.FrameRect(&m_rect, &brush);
}
}
```
其中,m_bDrawRect表示是否正在绘制矩形框,m_ptStart和m_ptEnd表示矩形框的起点和终点,m_rect表示矩形框的矩形区域。
4. 在对话框的消息映射中添加以下代码,以便在矩形框绘制完成后,自动记录矩形的4个参数:
```
void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
m_bDrawRect = FALSE;
m_ptEnd = point;
m_rect.SetRect(m_ptStart, m_ptEnd);
m_picture.ClientToScreen(&m_rect);
ScreenToClient(&m_rect);
m_picture.Invalidate(); // 重绘控件
// 记录矩形的4个参数
int x1 = m_rect.left;
int y1 = m_rect.top;
int x2 = m_rect.right;
int y2 = m_rect.bottom;
CDialogEx::OnLButtonUp(nFlags, point);
}
```
其中,x1、y1、x2、y2分别表示矩形的左上角和右下角的坐标。
5. 在对话框的初始化函数OnInitDialog()中,添加以下代码,以便初始化变量:
```
m_bDrawRect = FALSE;
m_ptStart = CPoint(0, 0);
m_ptEnd = CPoint(0, 0);
m_rect.SetRectEmpty();
```
这样就可以在MFC中选择一个图片,在picture control里面,通过鼠标拖出矩形,然后将矩形的4个参数自动记录下来了。
阅读全文