문제

나는 쉽게 생각해야 할 무언가로 어려움을 겪고 있습니다 (ISH). 양식 하단에 Windows 양식과 FlowGridLayout 패널이 있습니다. 이 양식 내에서는 X 수의 사용자 컨트롤로 동적으로 채워집니다. 컨트롤은 모두 동일한 유형입니다.

목표는 사용자가 사용자 컨트롤을 통해 마우스를 후버 할 때 다른 형태를 열고 마우스가있는 곳에 위치합니다. 마우스가 떠나면 형태가 열린 형태가 사라집니다.

이것은 거의 잘 작동합니다. 문제는 사용자 컨트롤에 라벨이나 텍스트 상자와 같은 것이있을 때입니다. UC를 떠난 것으로 간주되므로 양식이 사라집니다.

내 생각은 X와 Y를 사용하여 UC 내부에 있는지 알 수 있지만 이것을 알 수는 없습니다.

물어봐도 되나요:

1) 이것에 대한 가장 좋은 방법은 무엇입니까? 2) UC가 역동적이기 때문에 어떻게 코딩 할 수 있습니까? 나는 그들이 어디에 있는지 정확히 알 수 없습니다.

감사

편집하다

나는 마우스 포인터를 알아 내려고 노력하고 있지만 거기에 도착하지는 않습니다. 아래 코드는 UC SmallTagbox_Mouseleave 이벤트 내에 있습니다.

        Point loc = this.Location;
        Point p = this.PointToScreen(this.Location);
        Point p2 = this.PointToScreen(this.Parent.Location);

        Point ms = MousePosition;
        Rectangle screenBounds = new Rectangle(this.PointToScreen(this.Location), this.Size);
        if (!screenBounds.Contains(ms))
        {
            thw.Close();
            thw = null;
        }
  • loc {x = 275 y = 3} System.Drawing.point
  • p {x = 808 y = 908} System.Drawing.point
  • p {x = 808 y = 908} System.Drawing.point
  • P2 {x = 545 y = 1542} System.Drawing.point
  • MS {x = 574 y = 914} System.Drawing.point
  • ScreenBounds {x = 808 y = 908 너비 = 62 높이 = 29} System.Drawing.Rectangle

P2 (부모)가 화면에 비해 Y 값이 더 큰 방법을 이해하지 못합니다.

도움이 되었습니까?

해결책

모든 컨트롤 마우스 센터 및 마우스 엘리브 이벤트를 연결 한 다음 여전히 형태 안에 있는지 알아내는 것은 꽤 고통 스럽습니다. 간단한 타이머도 작업을 완료 할 수 있습니다.

  public partial class Form1 : Form {
    private Timer mTimer;
    public Form1() {
      InitializeComponent();
      mTimer = new Timer();
      mTimer.Interval = 200;
      mTimer.Tick += mTimer_Tick;
      mTimer.Enabled = true;
    }
    private void mTimer_Tick(object sender, EventArgs e) {
      if (!this.DesktopBounds.Contains(Cursor.Position)) this.Close();
    }
  }

다른 팁

아이디어 1) 언제 MouseLeave 이벤트 화재, 마우스 좌표 (화면에 비해)를 확인하고 Usercontrol의 범위 내에 있는지 확인할 수 있습니다. 그들이 있다면, 마우스가 컨트롤을 통과하여 경계를 벗어나야한다고 가정해야하며, 이번에는 이벤트를 안전하게 무시할 수 있습니다.

아이디어 2) 첨부 MouseEnter 어린이 컨트롤에 대한 이벤트 처리기. 그런 다음 마우스가 하나에 들어가면 Usercontrol의 것을 알고 무시할 수 있습니다. MouseLeave 이벤트. 그런 다음 아이가있을 때 MouseLeave 이벤트 화재, Usercontrol을 확인하십시오 MouseEnter 다시.

이벤트 핸들러를 추가 할 것이라고 생각합니다 MouseLeave 당신이 가진 모든 컨트롤에 대해 Parent 속성 사용자 컨트롤을 찾는 속성. 나는 약간 고통 스러울 것입니다.

또한 모든 어린이 컨트롤 (재귀)을 통제 할 수 있으며 마우스 센터 및 마우셀 리브 이벤트를 첨부 할 수도 있습니다.

마우스가 귀하의 통제에 있거나 아동 통제가 있으면 부기를해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top