c#事件处理

本文关键字:事件处理 | 更新日期: 2023-09-27 18:19:09

我正在做一架c#钢琴。我已经做了音乐键盘和琴键。用户每次按下某一键,该键就会显示在该键对应的位置上。

五线谱上显示的音符存储在一组图片框中,如下所示。

public void addPictureBox(int x, int y, Image image)
{
    picBox[cnt] = new PictureBox();
    picBox[cnt].Image = image;
    picBox[cnt].Location = new Point(x, y);
    picBox[cnt].BackColor = Color.Transparent;
    panel3.Controls.Add(picBox[cnt]);
    picBox[cnt].BringToFront();
    picBox[cnt].MouseDown += new MouseEventHandler(Pic_MouseDown);
    picBox[cnt].MouseUp += new MouseEventHandler(Pic_MouseUp);
    cnt++;
}

Pic_MouseDown和Pic_MouseUp事件允许用户通过点击五线谱来播放音符。

我现在要做的是在picBox[cnt]上创建一个事件用于拖动。然而,picBox[问]。鼠标按下和picBox[cnt]。MouseUp已经被注册到Pic_MouseDown和Pic_MouseUp事件处理程序。

我怎么能做一个事件来处理拖,因为MouseDown和MouseUp已经注册到其他事件处理程序?

谢谢:)

c#事件处理

事件处理程序的优点是您可以根据需要拥有任意多的附加处理程序。+= (操作符重载)意味着您正在向现有处理程序附加一个新的事件处理程序。您可以添加任意数量的事件处理程序。

事件处理程序概述

如果您创建了一个is拖动布尔实例字段,在鼠标向下时设置为true,在鼠标向上时设置为false,那么您可以使用鼠标移动事件来检测对象是否应该移动。

你需要使用MouseDown, MouseMove和MouseUp事件的组合。在MouseDown中,您只需设置一个标志来指示鼠标被按下,并记录按下的位置。在MouseMove中,您检查按钮是否仍然处于下位,并且光标移动的距离是否超过了SystemInformation.DragSize,这表明用户正在拖动而不是单击,并在需要时开始拖动操作。在MouseUp中,您可以完成拖动或执行单击操作。

我相信传统的拖放方式是

  • 在(源控制的)MouseDown处理程序中调用DoDragDrop
  • 在目标控件的AllowDrop属性中设置AllowDrop = true
  • 有一系列的拖动事件来微调行为
  • 似乎不需要担心任何潜在的MouseUpMouseClick事件。我假设这是因为按下和释放按钮的物理动作是在不同的控制和/或鼠标物理移动"足够远"。