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

MFC获取图片控件鼠标位置的问题
需要用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);
}

------解决方案--------------------
参考http://bsd-noobz.com/opencv-guide/45-3-using-mouse

引用:
需要用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);
}

------解决方案--------------------
你自己用GUI的话,就不要用cvSetMouseCallback("鼠标右键选取坐标",on_mouse,&position)了吧,就是说不要调用OpenCV自带的highgui,自己处理GUI以及键盘和鼠标事件。

引用:
Quote: 引用:

参考http://bsd-noobz.com/opencv-guide/45-3-using-mouse

Quote: 引用:

需要用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);
}

谢谢你的回答,但我不想做基于控制台的,这样打开图片不方便

------解决方案--------------------
“然后考虑保持图片大小在picture控件内做个滑动条,但转念头一想,这样鼠标获得的坐标仍然不一致。”
这个方法可以, 鼠标在 图的 实际坐标 可以 加上 滚动条 位置。