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

C# 将鼠标拖动到控件上以激活它们?,c#,C#,我的C#申请表中有一个问题。如果您知道Novation launchpad,它有一个8x8 LED矩阵按钮面板,我刚刚用灰色面板重新创建了它们,这些面板是由两个for循环生成的代码: for(int i=0;i<sizex;i++) { for(int j=0;j<sizex;j++) { //Panel creation here } } for(int i=0;我在大学期间为java(我知道c#不是java)跳棋游戏做了类似的事情。我不确定我的回答是否能有效

我的C#申请表中有一个问题。如果您知道Novation launchpad,它有一个8x8 LED矩阵按钮面板,我刚刚用灰色面板重新创建了它们,这些面板是由两个for循环生成的代码:

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

for(int i=0;我在大学期间为java(我知道c#不是java)跳棋游戏做了类似的事情。我不确定我的回答是否能有效地帮助你,因为我没有给你一个清晰的代码,我也不再掌握java代码。但下面是我使用的逻辑的简要描述:

  • 待机模式需要鼠标点击
  • 鼠标点击激活一个逻辑,跟踪鼠标在面板中的悬停位置
  • 在鼠标悬停的地方绘制代码,可能使用一些if-else 不无限期地绘制同一瓷砖的逻辑
  • 鼠标释放激活一个逻辑,该逻辑将程序再次设置为待机模式
  • 我不知道您正在使用哪个鼠标处理程序,但这可能会有所帮助:


    我希望它能对您有所帮助。

    鼠标悬停不会有帮助,您必须将鼠标悬停太长时间。您必须做的非直观的事情是在面板的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);
            }
        }
    }
    
    public Form1(){
    初始化组件();
    var面板=8;
    变量大小=20;
    var on=颜色。黄色;
    var off=颜色。黑色;
    对于(int i=0;i{
    panel.BackColor=panel.BackColor==开?关:开;
    panel.Capture=false;
    };
    panel.MouseMove+=(s,ea)=>{
    如果(ea.Button==MouseButtons.Left)panel.BackColor=Color.Yellow;
    };
    此.Controls.Add(面板);
    }
    }
    }
    
    您始终可以使用
    拖放方法:

        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);
                }
            }
        }
    
    private void Form1\u加载(对象发送方,事件参数e)
    {
    int boardSize=500;
    this.ClientSize=新尺寸(boardSize+2,boardSize+2);
    对于(int i=0;i<8;i++)
    {
    对于(int j=0;j<8;j++)
    {
    //您可以根据需要创建新面板
    //设置AllowDrop=true很重要!
    面板p=新面板
    {
    顶部=j*板尺寸/8,
    左=i*板尺寸/8,
    尺寸=新尺寸(boardSize/8+2,boardSize/8+2),
    AllowDrop=true,
    BorderStyle=BorderStyle.FixedSingle,
    };
    //此事件将启动DragDrop事件
    p、 MouseDown+=(o,args)=>((表单)sender).DoDragDrop(“,DragDropEffects.None);
    //现在您可以更改特定面板的颜色
    p、 DragOver+=(o,args)=>p.BackColor=Color.Blue;
    添加(p);
    }
    }
    }
    
    Winforms,Wpf?不使用悬停事件的原因是什么?这样一来,一方面可以进行点击和移动,对吗?我稍后会尝试!