'c#'에 해당되는 글 1건

  1. 2013.05.14 마우스 커서 위치에 있는 컨트롤 찾기

조금만 구글링 해보면 GetChildAtPoint와 PointToClient를 사용하라는 포스트가 널렸다. 조금 더 구글링 해보면 그것밖에 없다. 모두 그렇게 말한다. 그런데 그걸로 안된다 ㅋㅋ. 전자는 Visible이 false이거나 곂쳐진 경우를 무시하고 가장 뒤에 깔린 컨트롤을 반환하는 문제를, 후자는 Control.PointToClient가 이상한 값을 반환하는 문제를 가지고 있다. (Form의 메소드는 올바른 값을 반환한다. 왜 그런지 생각해볼 가치를 느끼지 못하고 있다.)


잘 동작하는 샘플을 찾지 못해 만들었다.


public static Control FindControlAtPoint(Control container, Point pos)
{
	Control child;
	foreach (Control c in container.Controls)
	{
		if (c.Visible && c.Bounds.Contains(pos))
		{
			child = FindControlAtPoint(c, new Point(pos.X - c.Left, pos.Y - c.Top));
			if (child == null) return c;
			else return child;
		}
	}
	return null;
}

public static Control FindControlAtCursor(Form form)
{
	Point pos = Cursor.Position;
	if (form.Bounds.Contains(pos))
		return FindControlAtPoint(form, form.PointToClient(Cursor.Position));
	return null;
}


스택 오버플로의 원문은 여기에.