【问题标题】:How can i make a class create a PictureBox object inside a form如何让一个类在表单内创建一个 PictureBox 对象
【发布时间】:2015-10-05 01:17:58
【问题描述】:

我正在尝试创建一个MainCharacter 类,其工作是根据每次加载时通过房间的一些参数在“房间”对象内创建一个PictureBox

这是MainCharacter类的代码:

namespace VirtualMuseum
{
    class MainCharacter
    {
        string characterName;
        int characterGender;
        bool registeredUser;
        int[] playerPosition;


        // Character constructor
        public MainCharacter(string name, int gender, bool registered, int[] location)
        {
            characterName = name;
            characterGender = gender;
            registeredUser = registered;
            playerPosition = location;
        }

        public void drawCharacter()
        {
            PictureBox playerBox = new PictureBox();
            playerBox.Image = Properties.Resources.mc___main_characters_sprites_by_ssb_fan4ever_d53kkhx;
            playerBox.Width = 28;
            playerBox.Height = 32;
            playerBox.Location = new Point(playerPosition[0], playerPosition[1]);
            playerBox.Visible = true;    
        }
    }
}

例如在 room1 中创建播放器对象的代码行

MainCharacter player1 = new MainCharacter(playerName, playerGender, registeredUser, playerPosition);

问题是当进入创建播放器对象的特定房间时,表单内看不到PictureBox

----- 新动作-----

根据您的指示,在 Room 类中使用以下代码

public Hall()
    {
        playerPosition = new int[] { 350, 400 };

        InitializeComponent();
        //pictureBox2.Parent = pictureBox1;
        MessageBox.Show(playerPosition.ToString());

        MainCharacter player1 = new MainCharacter(playerName, playerGender, registeredUser, playerPosition);

        player1.drawCharacter(this);
}

以及 MainCharacter 类中的以下代码:

public void drawCharacter(Form form)
    {
        PictureBox playerBox = new PictureBox();
        playerBox.Image = Properties.Resources.mc___main_characters_sprites_by_ssb_fan4ever_d53kkhx;
        playerBox.Width = 28;
        playerBox.Height = 32;
        playerBox.Location = new Point(playerPosition[0], playerPosition[1]);

        // Add the pictureBox to the selected form
        form.Controls.Add(playerBox);
}

虽然我在 drawCharacter 方法中定义了图片框的大小,但我设法在表单内绘制了一些东西,但它看起来像一条非常小的线。

【问题讨论】:

  • PictureBox(和任何控件)必须添加到表单中才能可见。

标签: c# winforms picturebox


【解决方案1】:

选项1
拥有您的表单实例,在 drawCharacter 末尾添加此代码:

formInstance.Controls.Add(playerBox);

例如:

public void drawCharacter(Form formInstance)
{
    PictureBox playerBox = new PictureBox();
    // Set properties ...

    formInstance.Controls.Add(playerBox);
}

然后在您的表单中,当您需要调用此方法时使用:

 var player1 = new MainCharacter(playerName, playerGender, registeredUser, playerPosition);
 player1.drawCharacter(this);

选项2
您可以更改方法以返回PictureBox

public PictureBox drawCharacter()
{
    PictureBox playerBox = new PictureBox();
    // Set properties ...

    return  playerBox;
}

然后在您的表单中,当您需要调用此方法时使用:

var player1 = new MainCharacter(playerName, playerGender, registeredUser, playerPosition);
this.Controls.Add(player1.drawCharacter());

关键点:

  • 正如“Ivan Stoev”在 cmets 中所述,所有控件都必须添加到 Controls 表单集合中。
  • 不要忘记将 location 属性设置为合适的位置或更好的选项,使用 FlowLayoutPanel 并将您的 PictureBox 添加到其中。例如,如果您从 (flowLayoutPanel1) 放置一个 FlowLayoutPabel,您可以使用选项 2 并以这种方式添加图片框

使用 FlowLayoutPanel 的代码:

var player1 = new MainCharacter(playerName, playerGender, registeredUser, playerPosition);
this.flowLayoutPanel1.Controls.Add(player1.drawCharacter());

【讨论】:

  • 我尝试了第一个和第二个选项,但还没有出现。难道我的 Room1 类是另一个名为 Location 的类的子类,而后者是 Form 的子类?
  • @OrestesMoressis 你有任何面板或一些容器控件来填充表单吗?
  • 不,我只在 Room1[设计] 中插入了另一个带有房间背景的 PictureBox 对象和一个用于小视频的 windows 媒体播放器 COM 组件。
  • 检查Location属性的值,也可以设置一个name属性,然后使用var pic = this.Controls["the name"]访问该控件,例如调用pic.BringToFront();
  • 我终于做到了。主要解决方案是您建议的解决方案,但我不得不从表单代码中更改图片框的一些内容。非常感谢您的帮助!
【解决方案2】:

您忘记将PictureBox 添加到表单中。如果没有将表格存放在您的 PictureBox 中,则不会显示。您的代码可能需要将表单传递给 drawCharacter() 方法,并在方法内部添加类似以下内容:

YourFormVariable.Controls.Add(playberBox)

附带说明:您不想一遍又一遍地将PictureBoxes 添加到表单中,您希望添加一个并不断地对其进行操作。我只是将其作为警告提及,因为 drawCharacter() 听起来可以在“渲染”类型循环中调用。

【讨论】:

    【解决方案3】:

    问题是您没有将表单实例传递给您的类,因此它无法在其上创建控件。将您的 drawCharacter 方法更改为:

      class MainCharacter
        {
        string characterName;
        int characterGender;
        bool registeredUser;
        int[] playerPosition;
    
        // Character constructor
        public MainCharacter(string name, int gender, bool registered, int[] location)
        {
            characterName = name;
            characterGender = gender;
            registeredUser = registered;
            playerPosition = location;
        }
    
        public void drawCharacter(Form form)
        {
            PictureBox playerBox = new PictureBox();
            playerBox.Image = Properties.Resources.mc___main_characters_sprites_by_ssb_fan4ever_d53kkhx;
            playerBox.Width = 28;
            playerBox.Height = 32;
            playerBox.Location = new Point(playerPosition[0], playerPosition[1]);
            playerBox.Visible = true;
            form.Controls.Add(playerBox);
        }
    }
    

    并像这样使用它:

    MainCharacter player1 = new MainCharacter(playerName, playerGender, registeredUser, playerPosition);
    
    player1.drawCharacter(this);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多