将鼠标拖到控件上以激活它们
本文关键字:激活 控件 鼠标 | 更新日期: 2023-09-27 18:13:08
我在c#应用程序中有一个问题。如果你知道Novation启动平台,它有一个8x8的LED矩阵按钮面板,我只是用灰色面板重新创建了它们,这些面板是由两个for循环生成的代码:
for(int i=0;i<sizex;i++)
{
for(int j=0;j<sizex;j++)
{
//Panel creation here
}
}
现在,如果我为它们创建Click事件处理程序,我就可以创建一个绘画系统(我想改变面板的颜色)。但我希望它像在真正的绘画应用程序,你可以很容易地拖动你的鼠标在一些领域,同时保持鼠标左键画每一个面板位于鼠标下…悬停事件由于某些原因不能工作。任何想法?
MouseHover不会有帮助,你必须将鼠标悬停太长时间。你必须做的不直观的事情是在面板的MouseDown事件中关闭鼠标捕获。需要这样其他面板仍然获得鼠标事件。样板代码:
public Form1() {
InitializeComponent();
var panels = 8;
var size = 20;
var on = Color.Yellow;
var off = Color.Black;
for (int i = 0; i < panels; i++) {
for (int j = 0; j < panels; j++) {
var panel = new Panel() {
Left = i * size, Top = j * size,
Width = size, Height = size, BackColor = off
};
panel.MouseDown += (s, ea) => {
panel.BackColor = panel.BackColor == on ? off : on;
panel.Capture = false;
};
panel.MouseMove += (s, ea) => {
if (ea.Button == MouseButtons.Left) panel.BackColor = Color.Yellow;
};
this.Controls.Add(panel);
}
}
}
您始终可以使用drag&drop
方法:
private void Form1_Load(object sender, EventArgs e)
{
int boardSize = 500;
this.ClientSize = new Size(boardSize + 2, boardSize + 2);
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
//New panel you can create like you want it
//It's important to set AllowDrop = true!
Panel p = new Panel
{
Top = j * boardSize / 8,
Left = i * boardSize / 8,
Size = new Size(boardSize / 8 + 2, boardSize / 8 + 2),
AllowDrop = true,
BorderStyle = BorderStyle.FixedSingle,
};
//This event will start DragDrop events
p.MouseDown += (o, args) => ((Form)sender).DoDragDrop("", DragDropEffects.None);
//Now you can change color of particual Panel
p.DragOver += (o, args) => p.BackColor = Color.Blue;
Controls.Add(p);
}
}
}
在大学期间为java(我知道c#不是java)跳棋游戏做了类似的事情。我不确定我的回答是否能有效地帮助您,因为我没有给您一个清晰的代码,而且我不再掌握java代码了。下面是我使用的逻辑的简要描述:
- 待机模式期望鼠标点击;
- 鼠标点击激活一个逻辑,跟踪鼠标在面板中的悬停位置;
- 绘制鼠标悬停的代码,可能使用一些if-else逻辑不画相同的瓷砖无限期;
- 鼠标释放激活一个逻辑,使程序重新进入待机模式。
我不知道你在使用哪个鼠标处理程序,但这可能会有所帮助:https://msdn.microsoft.com/pt-br/library/system.windows.forms.control.mousehover (v = vs.110) . aspx