如何获取视图窗口鼠标坐标的绝对位置X,Y

时间:2021-01-28 10:24:43
在一个带有垂直(水平)滚动条的视图窗口中,鼠标点击窗口的客户区左上角后,通过 LButtonDown()能获得 point.x = 0, point.y = 0; (这是正确的)

滚动窗口的垂直(水平)滚动条后,鼠标再次点击窗口的客户区左上角点击后,通过 LButtonDown()能获得的 仍然 是 point.x = 0, point.y = 0; (这不是我想要的)

这时我想获得的point.x 与 point.y 应该是加上垂直(水平)滚动的距离,

请问应该怎样把获得的point.x = 0, point.y = 0 转换 成整个窗口客户区的绝对 X,Y 或 怎样获取 垂直(水平)滚动的距离呢

谢谢

11 个解决方案

#1


我也想学学

#2


直接获得似乎没有这样的方法, 当点击滚动条后,滚动条会向父窗口发送单击消息,然后计算滚动的距离, 根据这个距离,计算你所说的绝对坐标吧

#3


不能直接改吧··要你自己去计算,根据垂直和水平滚动条的位置来计算当前的坐标·

#4


使用与滚动条操作相关的函数,GetScrollBarInfo,GetScrollPos等等,具体参看MSDN

#5


请问如何获取滚动条滚动距离
我添加了消息响应
void CXXXView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO:
pScrollBar->GetScrollPos(); //程序在这里异常了
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
当点击滚动条时,程序运行到pScrollBar->GetScrollPos()就跑飞了,
应该怎样获得滚动条滚动距离呢

#6


要用到转换语句clientToScreen语句转换吧

#7


你现在获得的坐标point.x = 0, point.y = 0是桌面坐标,应该转换成窗口坐标。用               clientToScreen(&point)转换

#8


CDC* pDC=m_pScrollView->GetDC();
CPoint pt=-m_pScrollView->GetDeviceScrollPosition();
pDC->SetViewportOrg(pt);
pDC->LPtoDP(鼠标点击获取的点);

#9


已经找到方法解决,给大家参考
CClientDC dc(this);
OnPrepareDC(&dc);
dc.DPtoLP(&point);

#10


OnPrepareDC(&dc);
在其基类中实际上就是调用了
CPoint pt=-m_pScrollView->GetDeviceScrollPosition();
pDC->SetViewportOrg(pt);

#11


rect1[i].PtInRect(point+GetDeviceScrollPosition()得到相应位置

#1


我也想学学

#2


直接获得似乎没有这样的方法, 当点击滚动条后,滚动条会向父窗口发送单击消息,然后计算滚动的距离, 根据这个距离,计算你所说的绝对坐标吧

#3


不能直接改吧··要你自己去计算,根据垂直和水平滚动条的位置来计算当前的坐标·

#4


使用与滚动条操作相关的函数,GetScrollBarInfo,GetScrollPos等等,具体参看MSDN

#5


请问如何获取滚动条滚动距离
我添加了消息响应
void CXXXView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO:
pScrollBar->GetScrollPos(); //程序在这里异常了
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
当点击滚动条时,程序运行到pScrollBar->GetScrollPos()就跑飞了,
应该怎样获得滚动条滚动距离呢

#6


要用到转换语句clientToScreen语句转换吧

#7


你现在获得的坐标point.x = 0, point.y = 0是桌面坐标,应该转换成窗口坐标。用               clientToScreen(&point)转换

#8


CDC* pDC=m_pScrollView->GetDC();
CPoint pt=-m_pScrollView->GetDeviceScrollPosition();
pDC->SetViewportOrg(pt);
pDC->LPtoDP(鼠标点击获取的点);

#9


已经找到方法解决,给大家参考
CClientDC dc(this);
OnPrepareDC(&dc);
dc.DPtoLP(&point);

#10


OnPrepareDC(&dc);
在其基类中实际上就是调用了
CPoint pt=-m_pScrollView->GetDeviceScrollPosition();
pDC->SetViewportOrg(pt);

#11


rect1[i].PtInRect(point+GetDeviceScrollPosition()得到相应位置