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);}

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

你这个程序的正确做法:

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

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

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

追问

大神说的果然有道理,由于我对坐标这部分现在比较混乱,也不知道该怎么改了,大神能帮我改一下嘛 或者在具体说说我该怎么改~

追答

已经说得很细致了。。。
直接在函数最上面获取rect,用参数值判断PtInRect即可。

温馨提示:答案为网友推荐,仅供参考
相似回答