WINFORM- 마우스가 사용자 제어를 남겼는지 확인하십시오
-
05-07-2019 - |
문제
나는 쉽게 생각해야 할 무언가로 어려움을 겪고 있습니다 (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
속성 사용자 컨트롤을 찾는 속성. 나는 약간 고통 스러울 것입니다.
또한 모든 어린이 컨트롤 (재귀)을 통제 할 수 있으며 마우스 센터 및 마우셀 리브 이벤트를 첨부 할 수도 있습니다.
마우스가 귀하의 통제에 있거나 아동 통제가 있으면 부기를해야합니다.