接上篇文章【MFC初探 —— 双击Picture Control具体位置放大图片】继续,在触摸式的工控机上,双击并不灵敏,所以我更改了实现方式。本打算使用单击来进行,在类向导中并没有找到单击消息,最后选择使用MouseUp来实现
1、设置属性通知为False。
2、在MouseUp事件中添加代码块。
其中msPicture1代码显示图片变量。
void CCameraTemplate::OnLButtonUp(UINT nFlags, CPoint point)
{
CPoint picPoint;
CRect rectCamera1;
CRect rectZoomCamera1;
m_Camera1.GetWindowRect(rectCamera1);
ScreenToClient(&rectCamera1);
rectZoomCamera1.top = rectCamera1.top + PIC_CONTROL_BORDER;
rectZoomCamera1.left = rectCamera1.left + PIC_CONTROL_BORDER;
rectZoomCamera1.bottom = rectZoomCamera1.top + msPicture1.GetHeight() - PIC_CONTROL_BORDER;
rectZoomCamera1.right = rectZoomCamera1.left + msPicture1.GetWidth() - PIC_CONTROL_BORDER;
if (rectZoomCamera1.PtInRect(point))
{
picPoint.x = point.x - rectZoomCamera1.left;
picPoint.y = point.y - rectZoomCamera1.top;
ZoomImageAdaptiveForm(rectCamera1, picPoint, cvOriPicture1, cvPicture1, &msPicture1, &d_ZoomRadioCamera1);
m_Camera1.GetWindowRect(rectCamera1);
ScreenToClient(rectCamera1);
InvalidateRect(rectCamera1);
}
CDialogEx::OnLButtonUp(nFlags, point);
}
3、ZoomImageAdaptiveForm函数用来缩放图片。
void ZoomImageAdaptiveForm(CRect rect, CPoint picPoint, cv::Mat cvOriImage, cv::Mat cvImage, CImage* msImage, double* zoomRadio)
{
if (!cvImage.data)
return;
cv::Mat zoomPicMark;
cv::Mat imagePart;
int height = 0; // 图片的高
int width = 0; // 图片的宽
// 放大后图片的右上角坐标
int picCutTop = 0;
int picCutLeft = 0;
if ((*zoomRadio) == 1)//放大图片
{
(*zoomRadio) = 2;
GetFixMat(cvOriImage, zoomPicMark, cvImage.rows * (*zoomRadio), cvImage.cols * (*zoomRadio));
// 判断原图像是否大于放大后的图像,若大于进行放大,否则就不进行放大
if (cvOriImage.rows > zoomPicMark.rows && cvOriImage.cols > zoomPicMark.cols)
{
picCutTop = (int)((double)picPoint.y * ((*zoomRadio) - 1));
picCutLeft = (int)((double)picPoint.x * ((*zoomRadio) - 1));
height = zoomPicMark.rows - picCutTop;
width = zoomPicMark.cols - picCutLeft;
}
else // 显示原图像大小
{
zoomPicMark = cvImage;
picCutTop = 0;
picCutLeft = 0;
height = zoomPicMark.rows;
width = zoomPicMark.cols;
}
}
else // 还原图像
{
(*zoomRadio) = 1;
zoomPicMark = cvImage;
picCutTop = 0;
picCutLeft = 0;
height = zoomPicMark.rows;
width = zoomPicMark.cols;
}
if (height > rect.bottom - rect.top)
{
height = rect.bottom - rect.top;
}
if (width > rect.right - rect.left)
{
width = rect.right - rect.left;
}
imagePart = zoomPicMark(cv::Rect(picCutLeft, picCutTop, width, height));
Mat2CImage(imagePart, (*msImage));
}