MFC中,鼠标在picture control控件内移动,显示坐标

坐标可以显示,但是不正确,显示的范围是从对框框边缘到控件大小的位置,并不是在控件内才显示,不知错在哪里,请各位好心人帮忙看一下,问题描述成图形为:我本想在红色框空间内鼠标... 坐标可以显示,但是不正确,显示的范围是从对框框边缘到控件大小的位置,并不是在控件内才显示,不知错在哪里,请各位好心人帮忙看一下,问题描述成图形为:

我本想在红色框空间内鼠标移动才显示坐标,现在的运行结果是在绿色区域(和控件一样大小)内显示坐标,灰色是我自己加载的工具栏,具体代码如下:
void CMy0414CoastDlg::OnMouseMove(UINT nFlags, CPoint point)//鼠标移动实时显示经纬度坐标值{ // TODO: 在此添加消息处理程序代码和/或调用默认值 double a, b, LAT, LON;//a,b为确定坐标范围用,LAT,LON为坐标转换用 int Lat, Lon, Latdegree, Londegree; CPoint newpoint;//拖拽中点移动轨迹 POINT point_mouse;//判断是否鼠标在矩形框内用
WGS84ToMercator(-86 * 60, 179.9 * 60, &a, &b, 0, 0, 0);//逻辑坐标范围
CRect rect; CRect rect1;//获取整个对话框大小用 CWnd *pWnd;
CDC *dc = GetDlgItem(IDC_Track)->GetDC();
pWnd = GetDlgItem(IDC_Track);//获得pictrue控件窗口的句柄 pWnd->GetClientRect(&rect);//获得pictrue控件所在的大小

dc->SetMapMode(MM_ANISOTROPIC);//映射模式 dc->SetWindowExt(abs(zoomby - b) * 2, abs(zoombx - a) * 2);//设定窗口逻辑尺寸,设置坐标范围,经度[-179~189],纬度[-86~86],经纬度坐标变换为直角坐标的值 dc->SetViewportExt(rect.right, -rect.bottom);//正北、正东为正方向 dc->SetViewportOrg(rect.right / 2, rect.bottom / 2);//设置窗口中心点为坐标系原点,使用物理坐标
dc->DPtoLP(&point);//物理坐标转换为逻辑坐标(转换为墨卡托坐标)
//******************显示经纬度********************************//
MercatorToWGS84(point.y, point.x, &LAT, &LON, 0, 0);//(墨卡托坐标转换为GW84坐标)
Lat = int(LAT / 60);//单位度 Lon = int(LON / 60); Latdegree = abs(LAT - Lat * 60);//单位分 Londegree = abs(LON - Lon * 60);
GetCursorPos(&point); if (rect.PtInRect(point))//鼠标在矩形内 { m_Showlatlon.Format(_T("经度:%d度%d分\n纬度:%d度%d分"), Lon, Londegree, Lat, Latdegree); } else//鼠标不在选择区域内 { m_Showlatlon.Format(_T("经度:NAN\n纬度:NAN")); } UpdateData(0);
CDialogEx::OnMouseMove(nFlags, point);}
展开
 我来答
bhtzu
2015-04-24 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4232万
展开全部

GetCursorPos获取的是屏幕坐标,GetClientRect是窗口坐标,两个坐标系不匹配,PtInRect结果当然错误。

你这个程序的正确做法:

  1. PtInRect判断应该放在函数首部,如果这个判断返值为FALSE,那么后面的坐标计算根本没有必要,效率提升不说,还避免了坐标系映射之类的可能产生的影响。

  2. 在OnMouseMove里面,GetCursorPos没用并且会降低效率。判断坐标应该使用函数参数来进行即可。

  3. 遇到坐标系不同的情况,可以使用ScreenToClient/ClientToScreen函数对,将坐标转换为相同的坐标系,再进行运算和判断。

追问
大神说的果然有道理,由于我对坐标这部分现在比较混乱,也不知道该怎么改了,大神能帮我改一下嘛   或者在具体说说我该怎么改~
追答
已经说得很细致了。。。
直接在函数最上面获取rect,用参数值判断PtInRect即可。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式