【问题标题】:Adding multiple PictureBox to a C# Form将多个 PictureBox 添加到 C# 窗体
【发布时间】: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


【解决方案1】:

看起来你没有初始化一个新的“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();
    

【讨论】:

  • 虽然创建额外的控件可能会起作用,但除了琐碎的乐谱外,它不会有效。
  • 在MusicNote类中初始化:public PictureBox picturebox1 = new PictureBox();
  • 如果picturebox1 是MusicNote 的一部分,这是公平的。但从这个名字看,它看起来像一个掺杂了 auto_name 的工具箱。
  • @Zobo 我应该在代码的哪一部分包含 panel.Refresh()?是不是每次创建 MusicNote 时都必须发生的事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 2016-04-19
  • 2017-05-21
  • 2023-04-07
相关资源
最近更新 更多