본문 바로가기
개발 이야기/C# 이야기

C# WPF 클릭위치 구하기

by 런던살자 2020. 6. 29.

안녕하세요 마블랑입니다.

 

이번 포스팅은 C# WPF 마우스가 클릭된 위치를 구하는 예제입니다

보통 클릭위치를 구할때는 이벤트를 이용하는데요

 

클릭되었을때 위치를 이벤트에서 전달받을수 있습니다.

 

그렇지만 버튼컨트롤을 제외하고는 클릭이벤트가 대부분 없을겁니다.

 

그래서 클릭이벤트와 비슷한 MouseDown 이벤트와 MouseUp 이벤트를 이용해서 클릭위치를 구하는데요

 

가장 기본적으로 클릭이벤트를 지원하는 버튼 클래스에서는 클릭이벤트에서 클릭위치를 전달받을수 있을줄 알았는데 아니더군요.

 

버튼 컨트롤도 MouseDown 이나 MouseUp 이벤트를 이용하면 클릭위치를 구할수있습니다~

 

코드는 아래와 같이 구현하면 됩니다~

 

굳이 정수형 변수로 대입할 필요없이 바로 Point 객체에서 위치를 가져올수 있습니다.

 

private void Img_ClickTest_MouseDown(object sender, MouseButtonEventArgs e)
{
    Point ClickPos = e.GetPosition((IInputElement)sender);

    int ClickX = (int)ClickPos.X;
    int ClickY = (int)ClickPos.Y;

    Console.WriteLine("MouseDown 위치 : "+ClickX + " " + ClickY);
}

private void Img_ClickTest_MouseUp(object sender, MouseButtonEventArgs e)
{
    Point ClickPos = e.GetPosition((IInputElement)sender);

    int ClickX = (int)ClickPos.X;
    int ClickY = (int)ClickPos.Y;

    Console.WriteLine("MouseUp 위치 : " + ClickX + " " + ClickY);
}

private void Img_ClickTest_MouseMove(object sender, MouseEventArgs e)
{
    Point ClickPos = e.GetPosition((IInputElement)sender);

    int ClickX = (int)ClickPos.X;
    int ClickY = (int)ClickPos.Y;

    Console.WriteLine("MouseMove 위치 : " + ClickX + " " + ClickY);
}

 

 

그럼 화면을 살펴보겠습니다.

 

이미지 컨트롤을 추가해서 클릭이벤트를 구현했는데요.. 이미지가 없으면 클릭이벤트 자체도 호출이 안되는 모양입니다.

 

그래서 이미지를 추가시키고 이벤트 호출을 확인했습니다~

바로 아래 그림은 이미지 위에서 마우스를 클릭했을때 이벤트입니다.

이미지에서의 마우스 클릭은 MouseDown - MouseUp 순서로 두개의 이벤트가 일어나기 때문에 각각의 위치가 다를수 있습니다. 

바로 아래 그림을 보면 이해하기가 쉬운데요 마우스를 클릭한뒤에 이동하고 마우스를 떼었더니 MouseDown, MouseUp의 위치가 다른것을 볼수 있습니다. 

 

현재 구현된 클릭이벤트는 이미지 컨트롤에 등록된 이벤트라서 위치도 이미지 위에서의 위치를 가져옵니다.

 

메인윈도우의 MouseDown에 위치를 가져오기를 해보니 메인윈도우와 이미지의 클릭위치가 다른것이 보이시죠?

 

메인윈도우는 메인윈도우의 좌표를, 이미지는 이미지의 좌표를 가져오기 때문입니다.

 

클릭이벤트 말고 MouseMove이벤트를 추가하면 아래처럼 마우스가 움직일때마다 좌표를 볼수 있습니다.

 

C# WPF 에서 마우스 클릭위치를 가져오는 방법에 대해서 알아보았습니다.

 

확인해보지 않았지만 WPF 말고도 Winform에서도 가능할듯 합니다.

 

 

클릭위치 가져오는 포스팅이었지만 클릭이벤트가 없는 컨트롤의 클릭이벤트 구현과 이벤트에 대해서 더 잘 알아본거같군요... 

 

 

이상 마블랑이었습니다.

 

읽어주어서 고맙습니다.

댓글