最近我需要知道鼠標在一個控件里的相對位置,鼠標相對於屏幕的位置我是可以知道的,所以只要得到控件相對於屏幕的位置,就可以算出鼠標相對於控件的位置了
但是發現有誤差
后來經過測試是由於窗體的標題欄高度導致的
所以減去了窗體的標題欄高度,但是還是有細微的誤差
最后經過分析,是由於獲取標題欄高度不正確導致的,當搜索如何獲取標題欄高度時 所有的答案都是child.Height - child.ClientRectangle.Height,這個做法其實是有誤差的,誤差甚至有10像素只差
正確的做法是
現先獲取窗體邊框寬度
int windowBorder = (child.Width - child.ClientRectangle.Width) / 2;
再減去窗體邊框高度
screenY -= (child.Height - child.ClientRectangle.Height - windowBorder);
獲取控件左上角相對於屏幕的位置
/// <summary> /// 獲取鼠標坐標 相對於視圖 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="child"></param> /// <returns></returns> private Point GetPoint(int x, int y, Control child) { Point p = new Point(); int screenX = x; int screenY = y; screenX -= child.Left; screenY -= child.Top; if (child.Parent == null) { int windowBorder = (child.Width - child.ClientRectangle.Width) / 2; screenY -= (child.Height - child.ClientRectangle.Height - windowBorder); p.X = screenX - windowBorder; p.Y = screenY; return p; } else { return GetPoint(screenX, screenY, child.Parent); } }
