鼠标移动动态显示坐标
在对话框中的Static Text控件中画了一个坐标,问题是鼠标移动显示的(x,y)坐标和坐标轴标注的值不一致,检查觉得转换公式没有问题,不知道哪里理解错了。具体代码如下,请高手详细解答。
void CPCI1710_MonitoringMenu::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rect;
GetDlgItem(IDC_STATIC10)->GetWindowRect(&rect);//取Static Text控件的大小
ScreenToClient(&rect);
m_toolTipDlg.m_rcClient = rect;//坐标显示框的大小
m_rcGragh.left = rect.left+30; //坐标及网格区域的大小
m_rcGragh.right = rect.right-10;
m_rcGragh.top = rect.top+10;
m_rcGragh.bottom = rect.bottom-30;
if(m_rcGragh.PtInRect(point))//判断是否在坐标区域内
{
// 移动鼠标时候,出现一个提示框来实现对坐标位置的实时跟踪
m_toolTipDlg.ShowWindow(SW_SHOW);
//显示对应坐标轴的坐标
m_toolTipDlg.x = (point.x-rect.left-30)/((rect.Width()-40.0)/8.0);
m_toolTipDlg.y = (rect.bottom-30-point.y)/((rect.Height()-40)/175);
//找到移动框显示的位置
ClientToScreen(&point);
//刷新显示框
m_toolTipDlg.Invalidate();
//移动显示框到对应坐标位置
m_toolTipDlg.MoveWindow(point.x+1, point.y+1, 180, 90, false);
}else
{
m_toolTipDlg.ShowWindow(SW_HIDE);
}
CDialog::OnMouseMove(nFlags, point);
}
坐标的转换是这样想的,因为
CRect rect;
GetDlgItem(IDC_STATIC10)->GetClientRect(rect);
int nxLength = rect.Width();//横轴长
int nyLength = rect.Height();//纵轴长
int nxDivisionNumber = 7;//7个坐标点0-6,8个分段
int nyDivisionNumber = 6;//纵坐标6个坐标点0-5,7个分段
。。。。
pDC->MoveTo(30,10);//绘制坐标轴
//坐标系在矩形中拒左下为30,距右上为10像素
pDC->LineTo(30,nyLength-30);//垂直轴
pDC->LineTo(nxLength-10,nyLength-30);//水平轴
所以,
横坐标公式:point.x减去Static Text控件的左边界再减去坐标轴拒左边界的30像素,用这些像素除以每个值(坐标轴标注的值)所拥有的像素。
横坐标为每段代表1,有8个段,(rect.Width()-40.0)/8.0即每段也即每个值所拥有的像素,其中40为控件宽度减去横轴长,即横轴拒左边和右边的像素大小。
纵坐标公式:同理,先求出当前点距离纵轴的这段距离,再用这段距离 除以 纵坐标上每个值所代表的像素 即得到当前点所代表的对应坐标值。
纵坐标有7个段,每段代表25。
通过测试显示的坐标值和对应坐标轴上标注的值不一致,不知道错误出在哪里,x轴还勉强对付,y轴却完全不对。求详细指点