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

+ Recent posts