我正在做一架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已经注册到其他事件处理程序?
谢谢:)
事件处理程序的优点是您可以根据需要拥有任意多的附加处理程序。+=
(操作符重载)意味着您正在向现有处理程序附加一个新的事件处理程序。您可以添加任意数量的事件处理程序。
事件处理程序概述
如果您创建了一个is拖动布尔实例字段,在鼠标向下时设置为true,在鼠标向上时设置为false,那么您可以使用鼠标移动事件来检测对象是否应该移动。
你需要使用MouseDown, MouseMove和MouseUp事件的组合。在MouseDown中,您只需设置一个标志来指示鼠标被按下,并记录按下的位置。在MouseMove中,您检查按钮是否仍然处于下位,并且光标移动的距离是否超过了SystemInformation.DragSize
,这表明用户正在拖动而不是单击,并在需要时开始拖动操作。在MouseUp中,您可以完成拖动或执行单击操作。
我相信传统的拖放方式是
- 在(源控制的)
MouseDown
处理程序中调用DoDragDrop
- 在目标控件的
AllowDrop
属性中设置AllowDrop = true
- 有一系列的拖动事件来微调行为
- 似乎不需要担心任何潜在的
MouseUp
或MouseClick
事件。我假设这是因为按下和释放按钮的物理动作是在不同的控制和/或鼠标物理移动"足够远"。