Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在鼠标周围创建按钮_C#_Cursor_Mouse - Fatal编程技术网

C# 在鼠标周围创建按钮

C# 在鼠标周围创建按钮,c#,cursor,mouse,C#,Cursor,Mouse,我想让指针周围显示4个按钮,当它延迟3秒时。如果我通过悬停4个按钮中的一个激活,所有按钮都将隐藏 像这样: 我假设您使用的是WinForms 一个问题是,您的图片实际上显示的不是矩形按钮。这是另一个困难,但我想把它限制在你的问题上。因此,您需要能够做一些事情 获取鼠标位置 获取一个方法,该方法在经过3秒没有鼠标移动时调用 动态创建按钮 设置按钮的位置。 让我们一步一步来: 一,。获取鼠标位置 因此,您必须处理MouseMove事件。因此,您可以选择表单,转到属性,按F4键,选择事件选项卡和闪电图

我想让指针周围显示4个按钮,当它延迟3秒时。如果我通过悬停4个按钮中的一个激活,所有按钮都将隐藏

像这样:


我假设您使用的是WinForms

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

获取鼠标位置 获取一个方法,该方法在经过3秒没有鼠标移动时调用 动态创建按钮 设置按钮的位置。 让我们一步一步来:

一,。获取鼠标位置

因此,您必须处理MouseMove事件。因此,您可以选择表单,转到属性,按F4键,选择事件选项卡和闪电图标,然后双击鼠标移动右侧的字段。这将在代码隐藏中创建Form1\u MouseMove方法。在此方法中,您可以使用e.Location;获取鼠标位置

到目前为止,我们的方法如下所示:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    var location = e.Location;
}
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);
}
二,。获取一个方法,该方法在3秒钟内没有鼠标移动时被调用

所以我想用定时器。要执行此操作,请再次切换到设计器按F7,打开工具箱CTRL+ALT+X并将计时器项拖动到窗体中。选择在窗体下可见的新创建的计时器,再次切换到“属性”选项卡,选择“闪电”左侧图标上的属性,双击“启用”右侧的字段将其设置为“真”,再次切换到“事件”选项卡,然后双击“勾号”右侧的字段。那里的方法将每100毫秒调用一次。然后添加一个名为_timepassedsincellastmove的字段。每次调用tick方法时,您都会增加该值,并在调用Form1\u MouseMove时再次将其设置为0。在timer1_Tick方法中,您将检查_timepassedsincellastmove字段是否已超过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()
    {
    }
}
三,。动态创建按钮

我认为这是最简单的任务。我认为最好用一个例子来解释:

var button = new Button();
Controls.Add(button);
我们只需创建一个新按钮,并将其添加到表单的控件中,这也会在代码中执行。如果我们想在鼠标不移动时添加4个按钮,我们可以这样做:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    var location = e.Location;
}
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);
}
四,。设置按钮的位置

设置按钮的位置也不是很难:

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);
}
现在,您说要在悬停时再次删除按钮。因此,我们需要创建一个按钮覆盖的方法:

现在我们只需删除添加到表单中的所有组件按钮。当然,如果表单中有更多的组件,则只需从组件中删除这四个按钮,并保留其余按钮

但是现在没有调用这个方法,因为我们没有处理按钮的悬停事件。因此,我们必须稍微修改一下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方法中更改对象初始值设定项中按钮的文本属性:

虽然这个解决方案看起来不像你的图片,这是因为不同形状的按钮,它应该可以帮助你解决你的问题。如果你的问题是不同形状的按钮,问一个新问题


我希望,我能帮助您。

很抱歉给您带来不便,我不知道如何创建这些按钮。您的目标是什么:Winforms、WPF、ASP。。?始终正确标记您的问题!提前谢谢你,我希望你的帮助:@YingYoh我遗漏了你问题的一部分,并根据要求编辑了我的答案。非常感谢你,这对我帮助很大。