我苦苦挣扎的东西,我认为应该很容易(ish).我有一窗式和一flowgridlayout小组在底部形式。这里面形成我动态填充X数量的用户控制。控制所有类型相同。

我们的目标是当用户的真空吸尘器鼠标的用户控制它开启了另一个形式和位置,它在那里的老鼠。当老鼠的叶子形式的开业形式中消失。

这几乎伟大工程。问题是当用户控制有什么样的标签或文字框内。它被认为已离开加州大学这样的形式消失。

我的想法然后使用X和Y诉如果是内加州大学但我可不想出解决办法。

我可以问:

1)什么是最好的办法吗?2)如何,我可以代码,作为加州大学的动态,我不能确切地知道他们将是。

感谢

编辑

我试图找出鼠标的指针,但没有得到在那里。代码下面是在加州大学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=275Y=3}系统。图。点
  • p{X=808Y=908}系统。图。点
  • p{X=808Y=908}系统。图。点
  • p2{X=545Y=1542}系统。图。点
  • ms{X=574Y=914}系统。图。点
  • screenBounds{X=808Y=908Width=62高度=29}系统。图。矩形

我不明白怎么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 事件火灾,你可以检查鼠标的坐标(相对于屏幕)和检查,如果他们仍然范围内的用户控件.如果他们,应该假定鼠已经通过后,通过控制得到外部界限,和你完全可以忽略的事件的这段时间。

想2)附加 MouseEnter 事件处理程序的孩子的控制。然后当老鼠进入一个,你会知道的,可以忽略用户控件的 MouseLeave 事件。然后,当孩子的 MouseLeave 事件火灾,检查的用户控件的 MouseEnter 再次。

我想我会添加一个事件处理程序 MouseLeave 对于每一个控制你有和使用 Parent 酒店找到的用户控制你之后。我同意,这会有点痛苦。

你也可以通过循环的所有儿童的控制(recursive)在你的控制,并附加一鼠和鼠标的事件。

你需要做的一些记账如果鼠标是在你的控制,或者一些孩子的控制。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top