2017-04-16 85 views
-4

我想在延迟3秒时在指针周围显示4个按钮。如果我通过悬停4个按钮之一来激活,所有按钮都将被隐藏。C#在鼠标周围创建按钮

像这样:

Mouse selection

感谢MetaColon,你救了我的命。

+0

对不起,我不知道如何创建这些按钮。 –

+0

你的目标是什么:Winforms,WPF,ASP ..? __Always__正确标记您的问题! – TaW

回答

0

我假设你正在使用WinForms。

问题是您的图片实际上显示的不是矩形按钮。这是另一个难点,但我想限制它到你的问题。因此,你需要能够做一些事情。

  1. 获取鼠标位置
  2. 优惠时3秒没有鼠标运动传递
  3. 动态创建按钮
  4. 设置按钮的位置被调用的方法。

让我们一步做到这一步:

1.获取鼠标位置

因此你必须处理MouseMove事件。因此,您选择您的表格,进入属性(按F4),选择事件选项卡(闪电图标),然后双击MouseMove右侧的字段。这将在您的代码中创建Form1_MouseMove方法。在此方法中,您可以使用e.Location;获取鼠标位置。

我们的方法到这里看起来像这样:

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    var location = e.Location; 
} 

2.开始一个当3秒没有鼠标移动通过

所以我想用一个定时器被调用的方法。要做到这一点,你再次切换到设计器(按F7),打开工具箱(CTRL + ALT + X)并将定时器项目拖到您的表单中。选择新创建的计时器(它在您的表单下可见),再次切换到属性选项卡,选择属性(闪电箭头左侧的图标),双击右侧的字段启用将其设置为true,开关再次点击事件标签,然后双击的右侧字段。那里的方法将被调用每100毫秒。然后,您将添加一个名为_timePassedSinceLastMove的字段。每调用一次tick方法,你都会增加这个值,当调用Form1_MouseMove时,将它再次设置为0。在timer1_Tick方法中,您将检查_timePassedSinceLastMove字段已超过30,如果是,则将调用应每3秒调用一次的方法。其实我们还是要请检查是否您的鼠标位置真正从旧的不同,因为是WinForms的一点点在这种情况下,过度敏感。因此,我们添加一个字段与原来的位置,并将其与新的。您的类应该是这个样子,现在:

public partial class Form1 : Form 
{ 
    private Point _oldMousePosition; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     var location = e.Location; 
     if (_oldMousePosition == location) 
      return; 
     _oldMousePosition = location; 
     _timePassedSinceLastMove = 0; 
    } 

    private int _timePassedSinceLastMove; 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     _timePassedSinceLastMove++; 
     if (_timePassedSinceLastMove > 30) 
     { 
      MouseNotMove3Seconds(); 
      _timePassedSinceLastMove = 0; 
     } 
    } 

    private void MouseNotMove3Seconds() 
    { 
    } 
} 

3.动态创建按钮

我会打电话给这个任务是最容易的。我认为这是对一个例子可以很好地解释说:

var button = new Button(); 
Controls.Add(button); 

我们只需创建一个新的按钮,将它添加到我们的表单控件(这是在代码执行后面的为好)。如果我们要添加4个按钮,只要鼠标不动了,我们将简单地做这样的:

private void MouseNotMove3Seconds() 
{ 
    var button1 = new Button(); 
    Controls.Add(button1); 
    var button2 = new Button(); 
    Controls.Add(button2); 
    var button3 = new Button(); 
    Controls.Add(button3); 
    var button4 = new Button(); 
    Controls.Add(button4); 
} 

4.设置按钮

的位置设置一个按钮的位置是不是太困难或者:

var button1 = new Button(); 
button1.Location = new Point(0, 0); 

我们可以写这个更漂亮以及与对象初始化:

var button1 = new Button {Location = new Point(0, 0)}; 

但现在我们不希望在位置0,0,但在我们的光标所有按钮。所以我们会做这样的事情(位置总是左上角的):

private void MouseNotMove3Seconds() 
{ 
    var button1 = new Button {Location = new Point(_oldMousePosition.X + Cursor.Size.Width, _oldMousePosition.Y)}; 
    Controls.Add(button1); 
    var button2 = new Button {Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y + Cursor.Size.Height)}; //I cheated a little bit here, but as the buttons are all the same... 
    Controls.Add(button2); 
    var button3 = new Button {Location = new Point(_oldMousePosition.X - (int)(button1.Width * 1.5), _oldMousePosition.Y)}; 
    Controls.Add(button3); 
    var button4 = new Button {Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y - (int)(button1.Height * 1.5))}; 
    Controls.Add(button4); 
} 

现在你说你想要徘徊时,再次删除按钮。因此,我们需要创建一个方法ButtonHovered:我们添加到窗体

private void ButtonHovered(object sender, EventArgs e) 
{ 
    Controls.Clear(); 
} 

现在,我们只是删除所有的组件(按钮)。当然,如果你在你的形式更多的组件,你必须只删除组件的四个按钮,剩下的英寸

,此方法是现在所谓的,但因为我们没有处理按钮的悬停事件。因此,我们必须修改我们的MouseNotMoved3Seconds方法一点点:

private void MouseNotMove3Seconds() 
{ 
    var button1 = new Button {Location = new Point(_oldMousePosition.X + Cursor.Size.Width, _oldMousePosition.Y)}; 
    Controls.Add(button1); 
    var button2 = new Button {Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y + Cursor.Size.Height)}; //I cheated a little bit here, but as the buttons are all the same... 
    Controls.Add(button2); 
    var button3 = new Button {Location = new Point(_oldMousePosition.X - (int)(button1.Width * 1.5), _oldMousePosition.Y)}; 
    Controls.Add(button3); 
    var button4 = new Button {Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y - (int)(button1.Height * 1.5))}; 
    Controls.Add(button4); 
    button1.MouseHover += ButtonHovered; 
    button2.MouseHover += ButtonHovered; 
    button3.MouseHover += ButtonHovered; 
    button4.MouseHover += ButtonHovered; 
} 

现在我们必须连接到ButtonHovered法的事件,当用户将鼠标悬停在按钮中的一个将被调用。

如果您想知道哪个按钮导致按钮消失,导致事件触发的按钮将通过sender属性给予ButtonHovered方法。

在您的图片您的按钮也对他们的书面文字,让我们做到这一点为好。因此,我们将在MouseNotMove3Seconds方法更改对象初始化按钮的Text属性:

private void MouseNotMove3Seconds() 
{ 
    var button1 = new Button 
    { 
     Location = new Point(_oldMousePosition.X + Cursor.Size.Width, _oldMousePosition.Y), 
     Text = "B" 
    }; 
    Controls.Add(button1); 
    var button2 = new Button 
    { 
     Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y + Cursor.Size.Height),//I cheated a little bit here, but as the buttons are all the same... 
     Text = "C" 
    }; 
    Controls.Add(button2); 
    var button3 = new Button 
    { 
     Location = new Point(_oldMousePosition.X - (int)(button1.Width * 1.5), _oldMousePosition.Y), 
     Text = "D" 
    }; 
    Controls.Add(button3); 
    var button4 = new Button 
    { 
     Location = new Point(_oldMousePosition.X - button1.Width/2, _oldMousePosition.Y - (int)(button1.Height * 1.5)), 
     Text = "A" 
    }; 
    Controls.Add(button4); 
    button1.MouseHover += ButtonHovered; 
    button2.MouseHover += ButtonHovered; 
    button3.MouseHover += ButtonHovered; 
    button4.MouseHover += ButtonHovered; 
} 

虽然这种解决方案并不像你的图片(这是因为不同形状的按钮),它应该帮助你与您的问题。如果你的问题是不同形状的按钮,请提出一个新问题。

我希望我能帮助你。

+0

预先感谢您,我希望对您有所帮助:) –

+0

@YingYoh我错过了您的部分问题,并编辑了符合要求的答案。 – MetaColon

+0

非常感谢,这对我很有帮助。 –