ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MFC初探 —— 双击Picture Control具体位置放大图片

2021-12-16 13:04:17  阅读:255  来源: 互联网

标签:Control Picture rectUse zoomPicMark ZoomRadioMark cvPicMark 双击 rect 图片


主要功能:在PictureControl中,双击位置1,图片就在位置1的位置进行放大,再次双击缩小至原图像。

1、为Picture Control添加控件事件 ——我这里命名为:OnStnDblclickStaticMark

 

 2、设置该控件属性的通知为true,即双击时将向其父级发送通知,默认不通知。

 

3、在事件中添加代码块

注意:其中有一部分为全局变量:

cvPicMark表示opencv读入的图片

d_ZoomRadioMark表示图形的缩放比例


void CCameraTemplate::OnStnDblclickStaticMark()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	CRect rect;
	//获取PictureControl控件区域,IDC_PICTURE为PictureControl的ID
	GetDlgItem(IDC_PICTURE)->GetWindowRect(&rect);
	// 将屏幕坐标切换至客户坐标
	ScreenToClient(&rect);
	
	// 获取当前鼠标的客户坐标
	CPoint   mypoint;
	GetCursorPos(&mypoint);
	ScreenToClient(&mypoint);
	
	// 注意:cvPicMark表示opencv读入的图片
	// rectUse为图片区域
	CRect rectUse;
	rectUse.top = rect.top;
	rectUse.left = rect.left;
	rectUse.bottom = rectUse.top + cvPicMark.rows;
	rectUse.right = rectUse.left + cvPicMark.cols;

	// 鼠标在PictureControl中的相对坐标
	CPoint picPoint;
	picPoint.x = mypoint.x - rectUse.left;
	picPoint.y = mypoint.y - rectUse.top;

	//判断鼠标点击坐标是否在图片区域内
	if (rectUse.PtInRect(mypoint))
	{
		// 缩放后的图片
		cv::Mat zoomPicMark;
		// 截取后的剩余部分图片
		cv::Mat imagePart;
		// 图片的高.宽
		int height = 0;  
		int weight = 0; 
		// 放大后图片的右上角坐标
		int picCutTop = 0;
		int picCutLeft = 0;
		if (d_ZoomRadioMark == 1)//放大图片
		{
			d_ZoomRadioMark = 2;

            //GetFixMat()改变Mat图像的大小,以适应窗体。但不改图像比例,图像不变形。
			GetFixMat(cvOriPicMark, zoomPicMark, cvPicMark.rows * d_ZoomRadioMark, cvPicMark.cols * d_ZoomRadioMark);
			picCutTop = (int)((double)picPoint.x * (d_ZoomRadioMark - 1));
			picCutLeft = (int)((double)picPoint.y * (d_ZoomRadioMark - 1));
			height = zoomPicMark.rows - picCutTop;
			weight = zoomPicMark.cols - picCutLeft;
		}
		else                     // 还原图像
		{
			d_ZoomRadioMark = 1;
			zoomPicMark = cvPicMark;
			picCutTop = 0;
			picCutLeft = 0;
			height = zoomPicMark.rows;
			weight = zoomPicMark.cols;
		}
		if (zoomPicMark.rows > rect.bottom - rect.top)
		{
			height = rect.bottom - rect.top;
		}
		if (zoomPicMark.cols > rect.right - rect.left)
		{
			weight = rect.right - rect.left;
		}
		imagePart = zoomPicMark(cv::Rect(picCutTop, picCutLeft, weight, height));

        // Mat2CImage()将mat图片转image
		Mat2CImage(imagePart, msPicMark);

		GetDlgItem(IDC_PICTURE)->GetWindowRect(&rect);
		ScreenToClient(rect);
		InvalidateRect(rect);

	}
	UpdateData(FALSE);
}

标签:Control,Picture,rectUse,zoomPicMark,ZoomRadioMark,cvPicMark,双击,rect,图片
来源: https://blog.csdn.net/OmuziO/article/details/121971925

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有