【发布时间】:2019-01-04 01:19:55
【问题描述】:
我正在尝试将几张音乐笔记的图片(使用 PictureBox)添加到音乐人员表格中。
在某个鼠标事件(MouseUp)中,创建了一个音符,并且一个音符应该出现在屏幕上。但是,只有在创建第一个音符时,图像才会出现在屏幕上。对于在第一个之后创建的所有其他注释,图像不会显示。
在下面的方法中,音乐笔记被创建:
private void Key_MouseUp(object sender, MouseEventArgs e)
{
foreach (MusKey mk in panel1.Controls)
{
if (sender == mk) //true for the specific key pressed on the Music Keyboard
{
if (e.Button == MouseButtons.Left)
{
timer1.Enabled = false;
sp.Stop();
string bNoteShape = null;
// ticks -> milliseconds
if (count >= 16)
{
bNoteShape = "SemiBreve";
duration = 1024;
}
else if (count >= 8 && count <= 15)
{
bNoteShape = "DotMinim";
duration = 768;
}
else if (count >= 4 && count <= 7)
{
bNoteShape = "Crotchet";
duration = 384;
}
else if (count >= 2 && count <= 3)
{
bNoteShape = "Quaver";
duration = 128;
}
else
{
bNoteShape = "Semi-Quaver";
duration = 90; //63 is too short
}
MusicNote mn = new MusicNote(mk.getMusicNote(), duration, bNoteShape, mk.getNote());
Notes.Add(mn);
mn.picturebox1.Location = new Point(xLoc1, yLoc1);
panel2.Controls.Add(mn.picturebox1); //adding MusicNote component to MusicStaff (panel2) collection
}
}
}
}
当 Note 创建时,它被发送到 MusicNote 构造函数:
public MusicNote(int iNotepitch, int iDuration, String iBnoteShape, String iNote)
{
notepitch = iNotepitch;
noteduration = iDuration;
noteshape = iBnoteShape;
note = iNote;
picturebox1.ImageLocation = NoteImage_path + noteshape + ".bmp";
picturebox1.BackColor = Color.Transparent;
picturebox1.Location = new Point(xLoc, yLoc);
xLoc = xLoc + 15;
}
我已经尝试通过构造函数以及 Key_MouseUp 方法中的表单本身来初始化位置(并增加 xLoc),但似乎两者都没有区别。
逻辑似乎是正确的,因为第一个音符的图片总是加载,但我不明白为什么第一个音符之后的所有其他音符都没有出现在我的屏幕上。
任何帮助将不胜感激,谢谢!
编辑:也许我可以用另一种替代 PictureBox 来存储音符?
【问题讨论】:
-
请出示
picturebox1的声明。 -
方法错误。一个图片框只能容纳一张图片,因此一旦您有第二张图片,它就无法工作。您也许可以移动或更改图片,但第一个音符会丢失。使用多个图片控件也不合适(假设您要显示多个注释),因为它会浪费资源。你真的需要自己在画布上画笔记。
-
我不确定创建图片框对象或添加到控件列表实际上是否足以创建它。至少,您可能需要使其可见,以便创建实际控件。
-
您的代码可能有很多问题,但您并未提供所有相关代码。例如,根据
xLoc的声明位置和方式,您可能会在 0 处获得预期位置或新初始化的位置。 -
@Phil1970 静态 int xLoc = 0; - 位于 MusicNote 类
标签: c# forms constructor picturebox