C#在鼠标周围创建按钮

时间:2017-04-16 12:42:50

标签: c# cursor mouse

我希望在延迟3秒时在指针周围显示4个按钮。如果我通过将4个按钮中的一个按下来激活,则所有按钮都将被隐藏。

  

像这样:

     
    

Mouse selection

  

谢谢MetaColon,你救了我的命。

1 个答案:

答案 0 :(得分:0)

我假设您正在使用WinForms。

问题是您的照片实际上不是矩形按钮。这是另一个难题,但我想将其限制在你的问题上。因此,您需要做一些事情。

  1. 获取鼠标位置
  2. 获取一个在没有鼠标移动的情况下3秒钟时调用的方法
  3. 动态创建按钮
  4. 设置按钮的位置。
  5. 让我们一步一步地做到这一点:

    <强> 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)并将 Timer 项拖到表单中。选择新创建的计时器(它在表单下可见),再次切换到属性选项卡,选择属性(闪电箭头左侧的图标),双击 Enabled 右侧的字段进行设置如果为true,请再次切换到“事件”选项卡,然后双击 Tick 右侧的字段。那里的方法每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方法,只要用户将鼠标悬停在其中一个按钮上,就会调用该方法。

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

    在你的照片中你的按钮上也写有文字,所以我们也这样做。因此,我们将在Text方法中更改对象初始值设定项中按钮的MouseNotMove3Seconds属性:

    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;
    }
    

    虽然这个解决方案看起来不像你的照片(那是因为形状不同的按钮),它可以帮助你解决问题。如果您的问题是形状不同的按钮,请提出一个新问题。

    我希望,我可以帮助你。