Добавление нескольких PictureBox в форму C # - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь добавить несколько фотографий (используя PictureBox) музыкальных заметок в форму Music Staff.

При определенном событии мыши (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

                }
            }
        }
    }

При создании заметки она отправляется в конструктор 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;
    }

Я попытался инициализировать местоположение (и увеличить xLoc) как через конструктор, так и в самой форме в методе Key_MouseUp, но ни один из них, похоже, не имеет значения.

Логика кажется правильной, поскольку изображение первой музыкальной ноты всегда загружается, но я не могу понять, почему каждая другая нота после первой не отображается на моем экране.

Любая помощь будет оценена, спасибо!

Редактировать: возможно, может быть есть другая альтернатива PictureBox, которую я мог бы использовать для хранения музыкальных нот?

1 Ответ

0 голосов
/ 02 января 2019

ну, похоже, вы не инициализируете новый "picturebox1"

    picturebox1 = new PictureBox(); //Add this
    picturebox1.ImageLocation = NoteImage_path + noteshape + ".bmp";

редактировать: Хорошо, в общем, нам нужно несколько вещей, чтобы добавить элемент управления в форму.

  1. новый элемент управления (похоже, он у вас есть) 2

  2. Добавление его в родительский элемент управления (похоже, у вас это есть)

    panel2.Controls.Add (mn.picturebox1); // добавление компонента MusicNote в коллекцию MusicStaff (panel2)

  3. перерисовать элемент управления - это может произойти автоматически при изменении размера формы или при вызове функции «Обновить» (на панели) после добавления нового элемента управления на панель.

    panel2.Controls.Add(mn.picturebox1); 
    panel2.Refresh();
    
...