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