答案 0 :(得分:0)
我假设您正在使用WinForms。
问题是您的照片实际上不是矩形按钮。这是另一个难题,但我想将其限制在你的问题上。因此,您需要做一些事情。
让我们一步一步地做到这一点:
<强> 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;
}
虽然这个解决方案看起来不像你的照片(那是因为形状不同的按钮),它可以帮助你解决问题。如果您的问题是形状不同的按钮,请提出一个新问题。
我希望,我可以帮助你。