将鼠标拖到控件上以激活它们?

时间:2015-09-16 20:54:48

标签: c#

我的C#应用​​程序中有一个问题。如果您了解Novation启动板,它有一个8x8 LED矩阵按钮面板,我只是用灰色面板重新创建它们,这些面板是用两个for循环生成的代码:

for(int i=0;i<sizex;i++)
{
  for(int j=0;j<sizex;j++)
  {
    //Panel creation here
  }
}

现在,如果我为它们创建Click事件处理程序,我可以创建一个绘图系统(我想更改面板的颜色)。但我希望它像真正的绘画应用程序一样,您可以轻松地将鼠标拖到某些字段上,同时按住鼠标左键来绘制鼠标下面的每个面板..悬停事件由于某种原因不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

MouseHover不会有帮助,你必须将鼠标悬停太久。您需要做的非直观的事情是在面板的MouseDown事件中关闭鼠标捕获。必需,以便其他面板仍然可以获得鼠标事件。 Boilerplate代码:

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

答案 1 :(得分:1)

您始终可以使用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);
            }
        }
    }

答案 2 :(得分:0)

在大学期间为java(我知道c#不是java)跳棋游戏做了类似的事情。我不确定我的回答是否能有效地帮助你,因为我没有给你一个明确的代码,而且我不再拥有那个java代码了。但这里是我使用的逻辑的简要描述:

  1. 待机模式需要鼠标点击;
  2. 鼠标单击激活一个逻辑,该逻辑跟踪鼠标悬停在面板中的位置;
  3. 绘制鼠标悬停的代码,可能使用了一些if-else 逻辑不要无限期地绘制相同的图块;
  4. 鼠标释放激活逻辑,再次将程序设置为待机模式。
  5. 我不知道您使用的是哪种鼠标处理程序,但这可能会有所帮助: https://msdn.microsoft.com/pt-br/library/system.windows.forms.control.mousehover(v=vs.110).aspx

    我希望它可以帮到你。