MFC获取图片控件鼠标位置的问题

zizi7 2013-09-20 03:40:16
需要用MFC做个图片显示模块,实现鼠标点击图片得到该点的像素值。
一开始考虑用PreTranslateMessage配合OnLButtonDown使用(参考http://blog.csdn.net/zhouworld16/article/details/6778939),但因为是用的DrawPicToHDC显示图片,它会铺满整个picture控件,从而导致图片拉伸变形,这样鼠标获得的坐标就与图片坐标不一致了。然后考虑保持图片大小在picture控件内做个滑动条,但转念头一想,这样鼠标获得的坐标仍然不一致。然后考虑opencv的cvSetMouseCallback函数,不要picture控件,仅是做个图片打开、关闭按钮和显示坐标值的edit控件。图片显示用opencv的cvNamedWindow.但运行起来似乎cvSetMouseCallback没获取鼠标位置(不要说用控制台,我知道那个很方便实现)
CvPoint position;

void on_mouse(int mouseEvent, int x,int y,int flags,void* param)
{
CvPoint* p=(CvPoint*)param;
int flag=0;
switch(mouseEvent)
{
case CV_EVENT_RBUTTONDOWN:
flag=1;
break;
case CV_EVENT_RBUTTONUP: // 右键弹起
{
if(flag==1)
{
p->x=x;
p->y=y;
flag=0;
}
}
break;
}
}
void CtestDlg::OnBnClickedButtonLoad()
{
// TODO: 在此添加控件通知处理程序代码
// 设置过滤器
/*按钮实现打开图片文件...*/
if(img) cvReleaseImage(&img);
img = cvLoadImage(pFileName_a,-1); //显示图片
cvNamedWindow("鼠标右键选取坐标");
cvShowImage("鼠标右键选取坐标",img);
cvSetMouseCallback("鼠标右键选取坐标",on_mouse,&position);
m_x=position.x;
m_y=position.y;
...
UpdateData(FALSE);
}
...全文
424 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Galloe 2015-12-22
  • 打赏
  • 举报
回复
LZ是怎么实现的
zizi7 2013-10-06
  • 打赏
  • 举报
回复
引用 8 楼 turingo 的回复:
你自己用GUI的话,就不要用cvSetMouseCallback("鼠标右键选取坐标",on_mouse,&position)了吧,就是说不要调用OpenCV自带的highgui,自己处理GUI以及键盘和鼠标事件。 [quote=引用 7 楼 zizi7 的回复:] [quote=引用 4 楼 turingo 的回复:] 参考http://bsd-noobz.com/opencv-guide/45-3-using-mouse [quote=引用 楼主 zizi7 的回复:] 需要用MFC做个图片显示模块,实现鼠标点击图片得到该点的像素值。 一开始考虑用PreTranslateMessage配合OnLButtonDown使用(参考http://blog.csdn.net/zhouworld16/article/details/6778939),但因为是用的DrawPicToHDC显示图片,它会铺满整个picture控件,从而导致图片拉伸变形,这样鼠标获得的坐标就与图片坐标不一致了。然后考虑保持图片大小在picture控件内做个滑动条,但转念头一想,这样鼠标获得的坐标仍然不一致。然后考虑opencv的cvSetMouseCallback函数,不要picture控件,仅是做个图片打开、关闭按钮和显示坐标值的edit控件。图片显示用opencv的cvNamedWindow.但运行起来似乎cvSetMouseCallback没获取鼠标位置(不要说用控制台,我知道那个很方便实现)
CvPoint position;

void on_mouse(int mouseEvent, int x,int y,int flags,void* param)
{
	CvPoint* p=(CvPoint*)param;
	int flag=0;
	switch(mouseEvent)
	{
		case CV_EVENT_RBUTTONDOWN:
			flag=1;
		break;
		case CV_EVENT_RBUTTONUP: // 右键弹起
		{
			if(flag==1)
			{
				p->x=x;
				p->y=y;
				flag=0;
			}
		}
		break;
	}
}
void CtestDlg::OnBnClickedButtonLoad()
{
	// TODO: 在此添加控件通知处理程序代码 
	// 设置过滤器
	/*按钮实现打开图片文件...*/
		if(img) cvReleaseImage(&img);
		img = cvLoadImage(pFileName_a,-1); //显示图片
	    cvNamedWindow("鼠标右键选取坐标");
		cvShowImage("鼠标右键选取坐标",img);
	cvSetMouseCallback("鼠标右键选取坐标",on_mouse,&position);
	m_x=position.x;
	m_y=position.y;
	...
	UpdateData(FALSE);
}
[/quote] 谢谢你的回答,但我不想做基于控制台的,这样打开图片不方便[/quote][/quote] 略高端哈~最后还是用最后的方案实现了
zizi7 2013-10-06
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
“然后考虑保持图片大小在picture控件内做个滑动条,但转念头一想,这样鼠标获得的坐标仍然不一致。” 这个方法可以, 鼠标在 图的 实际坐标 可以 加上 滚动条 位置。
对哦~~您知道怎么保持原大小做滑动条么?
schlafenhamster 2013-09-24
  • 打赏
  • 举报
回复
“然后考虑保持图片大小在picture控件内做个滑动条,但转念头一想,这样鼠标获得的坐标仍然不一致。” 这个方法可以, 鼠标在 图的 实际坐标 可以 加上 滚动条 位置。
图灵狗 2013-09-24
  • 打赏
  • 举报
回复
你自己用GUI的话,就不要用cvSetMouseCallback("鼠标右键选取坐标",on_mouse,&position)了吧,就是说不要调用OpenCV自带的highgui,自己处理GUI以及键盘和鼠标事件。
引用 7 楼 zizi7 的回复:
[quote=引用 4 楼 turingo 的回复:] 参考http://bsd-noobz.com/opencv-guide/45-3-using-mouse [quote=引用 楼主 zizi7 的回复:] 需要用MFC做个图片显示模块,实现鼠标点击图片得到该点的像素值。 一开始考虑用PreTranslateMessage配合OnLButtonDown使用(参考http://blog.csdn.net/zhouworld16/article/details/6778939),但因为是用的DrawPicToHDC显示图片,它会铺满整个picture控件,从而导致图片拉伸变形,这样鼠标获得的坐标就与图片坐标不一致了。然后考虑保持图片大小在picture控件内做个滑动条,但转念头一想,这样鼠标获得的坐标仍然不一致。然后考虑opencv的cvSetMouseCallback函数,不要picture控件,仅是做个图片打开、关闭按钮和显示坐标值的edit控件。图片显示用opencv的cvNamedWindow.但运行起来似乎cvSetMouseCallback没获取鼠标位置(不要说用控制台,我知道那个很方便实现)
CvPoint position;

void on_mouse(int mouseEvent, int x,int y,int flags,void* param)
{
	CvPoint* p=(CvPoint*)param;
	int flag=0;
	switch(mouseEvent)
	{
		case CV_EVENT_RBUTTONDOWN:
			flag=1;
		break;
		case CV_EVENT_RBUTTONUP: // 右键弹起
		{
			if(flag==1)
			{
				p->x=x;
				p->y=y;
				flag=0;
			}
		}
		break;
	}
}
void CtestDlg::OnBnClickedButtonLoad()
{
	// TODO: 在此添加控件通知处理程序代码 
	// 设置过滤器
	/*按钮实现打开图片文件...*/
		if(img) cvReleaseImage(&img);
		img = cvLoadImage(pFileName_a,-1); //显示图片
	    cvNamedWindow("鼠标右键选取坐标");
		cvShowImage("鼠标右键选取坐标",img);
	cvSetMouseCallback("鼠标右键选取坐标",on_mouse,&position);
	m_x=position.x;
	m_y=position.y;
	...
	UpdateData(FALSE);
}
[/quote] 谢谢你的回答,但我不想做基于控制台的,这样打开图片不方便[/quote]
zizi7 2013-09-24
  • 打赏
  • 举报
回复
引用 4 楼 turingo 的回复:
参考http://bsd-noobz.com/opencv-guide/45-3-using-mouse [quote=引用 楼主 zizi7 的回复:] 需要用MFC做个图片显示模块,实现鼠标点击图片得到该点的像素值。 一开始考虑用PreTranslateMessage配合OnLButtonDown使用(参考http://blog.csdn.net/zhouworld16/article/details/6778939),但因为是用的DrawPicToHDC显示图片,它会铺满整个picture控件,从而导致图片拉伸变形,这样鼠标获得的坐标就与图片坐标不一致了。然后考虑保持图片大小在picture控件内做个滑动条,但转念头一想,这样鼠标获得的坐标仍然不一致。然后考虑opencv的cvSetMouseCallback函数,不要picture控件,仅是做个图片打开、关闭按钮和显示坐标值的edit控件。图片显示用opencv的cvNamedWindow.但运行起来似乎cvSetMouseCallback没获取鼠标位置(不要说用控制台,我知道那个很方便实现)
CvPoint position;

void on_mouse(int mouseEvent, int x,int y,int flags,void* param)
{
	CvPoint* p=(CvPoint*)param;
	int flag=0;
	switch(mouseEvent)
	{
		case CV_EVENT_RBUTTONDOWN:
			flag=1;
		break;
		case CV_EVENT_RBUTTONUP: // 右键弹起
		{
			if(flag==1)
			{
				p->x=x;
				p->y=y;
				flag=0;
			}
		}
		break;
	}
}
void CtestDlg::OnBnClickedButtonLoad()
{
	// TODO: 在此添加控件通知处理程序代码 
	// 设置过滤器
	/*按钮实现打开图片文件...*/
		if(img) cvReleaseImage(&img);
		img = cvLoadImage(pFileName_a,-1); //显示图片
	    cvNamedWindow("鼠标右键选取坐标");
		cvShowImage("鼠标右键选取坐标",img);
	cvSetMouseCallback("鼠标右键选取坐标",on_mouse,&position);
	m_x=position.x;
	m_y=position.y;
	...
	UpdateData(FALSE);
}
[/quote] 谢谢你的回答,但我不想做基于控制台的,这样打开图片不方便
zizi7 2013-09-24
  • 打赏
  • 举报
回复
引用 3 楼 aizibion 的回复:
cvSetMouseCallback看名字就不是捕获坐标的吧,应该是在回调“on_mouse”获取位置。
位置是在on_mouse里获得,cvSetMouseCallback是个触发函数
「已注销」 2013-09-23
  • 打赏
  • 举报
回复
GetCursorPos GetPixel
图灵狗 2013-09-23
  • 打赏
  • 举报
回复
参考http://bsd-noobz.com/opencv-guide/45-3-using-mouse
引用 楼主 zizi7 的回复:
需要用MFC做个图片显示模块,实现鼠标点击图片得到该点的像素值。 一开始考虑用PreTranslateMessage配合OnLButtonDown使用(参考http://blog.csdn.net/zhouworld16/article/details/6778939),但因为是用的DrawPicToHDC显示图片,它会铺满整个picture控件,从而导致图片拉伸变形,这样鼠标获得的坐标就与图片坐标不一致了。然后考虑保持图片大小在picture控件内做个滑动条,但转念头一想,这样鼠标获得的坐标仍然不一致。然后考虑opencv的cvSetMouseCallback函数,不要picture控件,仅是做个图片打开、关闭按钮和显示坐标值的edit控件。图片显示用opencv的cvNamedWindow.但运行起来似乎cvSetMouseCallback没获取鼠标位置(不要说用控制台,我知道那个很方便实现)
CvPoint position;

void on_mouse(int mouseEvent, int x,int y,int flags,void* param)
{
	CvPoint* p=(CvPoint*)param;
	int flag=0;
	switch(mouseEvent)
	{
		case CV_EVENT_RBUTTONDOWN:
			flag=1;
		break;
		case CV_EVENT_RBUTTONUP: // 右键弹起
		{
			if(flag==1)
			{
				p->x=x;
				p->y=y;
				flag=0;
			}
		}
		break;
	}
}
void CtestDlg::OnBnClickedButtonLoad()
{
	// TODO: 在此添加控件通知处理程序代码 
	// 设置过滤器
	/*按钮实现打开图片文件...*/
		if(img) cvReleaseImage(&img);
		img = cvLoadImage(pFileName_a,-1); //显示图片
	    cvNamedWindow("鼠标右键选取坐标");
		cvShowImage("鼠标右键选取坐标",img);
	cvSetMouseCallback("鼠标右键选取坐标",on_mouse,&position);
	m_x=position.x;
	m_y=position.y;
	...
	UpdateData(FALSE);
}
aizibion 2013-09-23
  • 打赏
  • 举报
回复
cvSetMouseCallback看名字就不是捕获坐标的吧,应该是在回调“on_mouse”获取位置。
昆仑道长 2013-09-23
  • 打赏
  • 举报
回复
可以把位图想象成一个二维数组,所谓拉伸,放大位图,一般情况下是指对某些行或者列进行像素拷贝或者填充。如果显示位图的算法不是自己写的,很难控制它复制了哪些行或或者列,因此原始坐标不好确定。如果放大倍数是2的整数倍,一般情况下将显示坐标÷放大倍数就可以得到原始坐标,像素自然取出来了。
zizi7 2013-09-23
  • 打赏
  • 举报
回复
自己顶一个先

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧