728x90
이런 유저컨트롤 줄여서 폼이라고 하겠습니다.
폼위에 마우스가 올라갔을때랑 없을때를 확인 하고 싶었습니다.
그런데 폼위에 컨트롤이 여러개면 이게 winform은 확인하기가 좀 어렵습니다.
이런 이벤트등을 이용해서 할려고 했지만 동작은 가능 하지만 위에 폼처럼 컨트롤이 여러개 올라와 있으면
완벽한 동작을 기대 하기는 어렵습니다.
스토리가 긴대 컨드롤을 벗어났다는 이벤트는 폼 위에 텍스트박스 위로가도 벗어났다고 이벤트가 호출 됩니다.
이런 문제로 노가다로 텍스트박스에도 이벤트 처리를 해줘도 순간적으로 깜빡이는 보기 좋지 않은 모습이 보입니다.
그래서 폼 위에 투명 판넬을 올려서 처리 할려고 했지만.
폼은 보이는데 텍스트박스는 안보이는 문제가 있었습니다.
private void CarWash_Info_Card_MouseMove(object sender, MouseEventArgs e)
{
//this.BackColor = Color.Silver;
//int temp = 10;
//int width = this.Size.Width;
//int height = this.Size.Height;
//width = width - temp;
//height = height - temp;
//int width = e.Location.X;
//int height = e.Location.Y;
//string width = this.Location.X.ToString();
//string height = this.Location.Y.ToString();
//string width = this.Width.ToString();
//string height = this.Height.ToString();
//string width = this.Top.ToString();
//string height = this.Left.ToString();
//string x = Cursor.Position.X.ToString();
//string y = Cursor.Position.Y.ToString();
//string x = this.PointToClient(Cursor.Position.X);
//Point ss = this.PointToScreen(Cursor.Position);
//int x = ss.X;
//int y = ss.Y;
//int x = Cursor.Position.X;
//int y = Cursor.Position.Y;
//Point sss = this.PointToScreen(Point.Empty);
//int width = sss.X + (this.Size.Width - 10);
//int height = sss.Y + (this.Size.Height - 10);
//tbCarWashDescription.Text = $"Width: {width} Height: {height} ";
//tbCarWashAllNumber.Text = $"X: {x}, Y: {y}";
//if ((width > x) && (height > y))
//{
// //this.BackColor = default(Color);
// tbDataUpdateTime.Text = "안안안";
//}
//else tbDataUpdateTime.Text = "밖빡ㄲ빡";
//Cursor.Position.X.ToString();
//this.Cursor = new System.Windows.Forms.Cursor(System.Windows.Forms.Cursor.Current.Handle);
//System.Windows.Forms.Cursor.Position = new Point(0, 0);
//MoveCursor(300, 300);
//MoveCursor(400, 400);
}
여러 삽질의 흔적 ㄷㄷㄷ;;;
그래서 결국 마우스위치랑 폼위치랑 비교하는 타이머를 만들어서 처리했습니다.
WPF?! 로 하면 간단하다는데...지금와서 WPF로 돌아가기는 늦어서 어떻게든 방법을 찾았습니다.
private void CarWash_Info_Card_Load(object sender, EventArgs e) //처음 생성시 동작
{
//폼위에 마우스 있는지 확인하는 타이머
Timer checkMouseOnTimer = new System.Timers.Timer();
checkMouseOnTimer.Interval = 100 * 1; //1000 = 1초, ms 단위
checkMouseOnTimer.Elapsed += new ElapsedEventHandler(checkMouseOnTimer_Event); //이벤트 추가
checkMouseOnTimer.Start();
}
마우스 위치와 폼위치를 비교 할 타이머를 추가합니다.
//폼위에 마우스 있는지 확인하는 메소드
private void checkMouseOnTimer_Event(object sender, ElapsedEventArgs e)
{
this.BeginInvoke((System.Action)(() =>
{
int mouserPosionXtoScreen = Cursor.Position.X; //화면 기준 마우스 위치
int mouserPosionYtoScreen = Cursor.Position.Y; //화면 기준 마우스 위치
Point formZeroPosiontoScreen = this.PointToScreen(Point.Empty); //화면 기준 폼 시작 위치
int formZeroPosionXtoScreen = formZeroPosiontoScreen.X; //화면 기준 폼 시작 위치 X
int formZeroPosionYtoScreen = formZeroPosiontoScreen.Y; //화면 기준 폼 시작 위치 Y
int formWidth = this.Size.Width; //폼 가로 사이즈
int formHeight = this.Size.Height; //폼 세로 사이즈
int formSizeXtoScreen = formZeroPosionXtoScreen + formWidth; //화면 기준 폼 끝 X 위치
int formsizeYtoScreen = formZeroPosionYtoScreen + formHeight; //화면 기준 폼 끝 Y 위치
//화면 기준 폼 시작 위치 X < 마우스 위치 <화면 기준 폼 끝 X 위치
//화면 기준 폼 시작 위치 Y < 마우스 위치 <화면 기준 폼 끝 Y 위치
//일때 마우스가 폼위에 있다고 판단
if (((formSizeXtoScreen > mouserPosionXtoScreen) && (formsizeYtoScreen > mouserPosionYtoScreen)) &&
((formZeroPosionXtoScreen < mouserPosionXtoScreen) && (formZeroPosionYtoScreen < mouserPosionYtoScreen)))
{
MessageBox.Show("폼 위에 있음");
}
else
{
MessageBox.Show("폼 위에 없음");
}
}));
}
여기서 중요한 내용은 좌표의 기준이 폼 기준이냐 화면 기준이냐 입니다.
그럼 감사합니다~!
728x90
'C#' 카테고리의 다른 글
C# / 배열(List) 같은지 다른지 비교, SequenceEqual(), Sort() (0) | 2021.03.29 |
---|---|
C# / 배열(List) 비교해서 중복 안되는 항목 출력 / Collection was modified; enumeration operation may not execute (0) | 2021.03.29 |
C# 정규식 지정, 특정 문자만 입력, Regex.IsMatch (0) | 2021.03.23 |
c# using MAC Address / 맥주소 받아오기 / 사용중인 맥주소 받아오기 (0) | 2021.03.08 |
c# 인터넷 연결 확인 하기 (0) | 2021.02.26 |