System.ComponentModel.Win32Exception:创建窗口处理程序C#时出错

时间:2018-02-03 06:19:21

标签: c# winforms linq

所以,嗨。 我正在尝试制作2D神奇宝贝风格的游戏。所以我决定制作一个面板(所以我只让面板移动而不是一切),这将是~50 000像素盒(瓷砖)30 x 30像素......

但它给了我这个错误..

Error while creating a window handler

那么有没有人可以让50000 Picturebox出现?

我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using World;

namespace World
{
    public partial class LoadWorld : Form
    {
        public int TileSizeX = 30;
        public int TileSizeY = 30;
        public int TileT = 50630;
        public int TileX = 225;
        public int TileY = 225;
        public PictureBox[] WorldTile = new PictureBox[50630];
        public static Dictionary<PictureBox, int[]> tileProp = new Dictionary<PictureBox, int[]>();
        public LoadWorld()
        {
            InitializeComponent();

        }
        private void LoadWorld_Load(object sender, EventArgs e)
        {
            int valueA = 0;
            int valueX = 0;
            int valueY = 0;
            foreach (PictureBox pictureBoxValue in WorldTile)
            {
                if(valueY < TileY)
                {
                    if(valueX < TileX)
                    {
                        WorldTile[valueA] = new PictureBox()
                        {
                            Size = new Size(TileSizeX, TileSizeY),
                            Location = new Point(valueX * 30, valueY * 30),
                            BackgroundImage = new Bitmap("Sprites/null.png"),
                            Visible = true,
                            Name = "tile" + valueA
                        };
                        WorldMap.Controls.Add(WorldTile[valueA]);
                        valueA = valueA + 1;
                        valueX = valueX + 1;
                    }
                    else if(valueX == TileX)
                    {
                        WorldTile[valueA] = new PictureBox()
                        {
                            Size = new Size(TileSizeX, TileSizeY),
                            Location = new Point(valueX * 30, valueY * 30),
                            BackgroundImage = new Bitmap("Sprites/null.png"),
                            Visible = true,
                            Name = "tile" + valueA,
                         };
                        WorldMap.Controls.Add(WorldTile[valueA]);
                        valueA = valueA + 1;
                        valueY = valueY + 1;
                        valueX = 0;
                    }
                }
                else if(valueY == TileY)
                {
                    if (valueX < TileX)
                    {
                        WorldTile[valueA] = new PictureBox()
                        {
                            Size = new Size(TileSizeX, TileSizeY),
                            Location = new Point(valueX * 30, valueY * 30),
                            BackgroundImage = new Bitmap("Sprites/null.png"),
                            Visible = true,
                            Name = "tile" + valueA,
                        };
                        WorldMap.Controls.Add(WorldTile[valueA]);
                        valueX = valueX + 1;
                        valueA = valueA + 1;
                    }
                    else if (valueX == TileX)
                    {
                        WorldTile[valueA] = new PictureBox()
                        {
                            Size = new Size(TileSizeX, TileSizeY),
                            Location = new Point(valueX * 30, valueY * 30),
                            BackgroundImage = new Bitmap("Sprites/null.png"),
                            Visible = true,
                            Name = "tile" + valueA,

                        };
                        WorldMap.Controls.Add(WorldTile[valueA]);
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

问题的根源是Windows.Forms并不适合这项任务。

每个PictureBox控件都会创建一个系统HandleSystem.Windows.Forms.Control实际上包裹了HWND。这为Windows.Forms控件提供了一些操作系统功能,如绘画,鼠标点击测试,开箱即用。

问题是系统有限制 - 每个进程最多可以有 10,000个句柄,每个用户会话最多可以有66,536个句柄。在这里,您可以立即看到创建50,000个PictureBox控件的方式超出了Windows.Forms可以实现的限制

即使你能够做到这一点,整个渲染过程也会非常缓慢,游戏绝对无法播放。

我建议抛弃Windows.Forms并寻找替代方案。第一个选项是使用WPF,它可以处理大量控件而不会出现问题。但它仍然不是游戏的最佳选择。

但是,您可以选择Monogame来实现此目的。您可以在UWP或WPF中使用Monogame。这是一个非常容易学习的C#游戏框架,可以很好地满足您的需求。

如果您想要更多控制权,可以查看Unity,这是一个完整的游戏开发解决方案。然后,您的游戏可以移植到许多不同的平台,包括UWP,Android和iOS。