C# 动态显示数百幅图像

C# 动态显示数百幅图像,c#,winforms,image,gdi+,C#,Winforms,Image,Gdi+,我必须创建一个能够显示电影院大厅(不知道确切的单词)模式的表单。基本上,我必须显示大量(由另一个来源提供)独立的类似椅子的图像,这些图像可以在单击时更改颜色(状态) 我在网上冲浪寻找解决方案,但我真的不知道如何管理它。 有人能帮我吗?我想说,最简单的方法是创建并拥有“椅子控件”,它可以处理点击事件等。这只不过是一个简单的用户定义控件,以椅子图像为背景(必要时可以与其他图片交换) 在此之后,您可以通过代码(伪代码)轻松创建这些控件的一个大冲头: for(int row=0;row

我必须创建一个能够显示电影院大厅(不知道确切的单词)模式的表单。基本上,我必须显示大量(由另一个来源提供)独立的类似椅子的图像,这些图像可以在单击时更改颜色(状态)

我在网上冲浪寻找解决方案,但我真的不知道如何管理它。
有人能帮我吗?

我想说,最简单的方法是创建并拥有“椅子控件”,它可以处理点击事件等。这只不过是一个简单的用户定义控件,以椅子图像为背景(必要时可以与其他图片交换)

在此之后,您可以通过代码(伪代码)轻松创建这些控件的一个大冲头:

for(int row=0;row

构造函数获取行数和列数并自动调整其位置,例如…

我想在Bobby的回答中添加一点,即控件应该将图像预渲染为单个位图,并使用该位图刷新屏幕。更新位图以反映用户的更改。

还有数百种解决方案:D。
你可以,比如说,,将它们排列到一个布尔网格中,为用于绘制椅子的单元格自定义绘制,并为单元格单击一个事件,该事件会更改绑定到网格的列表/数据集的状态。

如果需要绘制这么多图像,最好是使用面板控件,通过处理OnPaint事件或甚至更好:创建从面板控件继承并替代绘制方法的自定义控件。联机查找如何在.NET中创建自定义绘制控件的示例

不要尝试使用图像控件或其他类似控件创建数百个图像,因为这会增加很多开销

在“绘制方法”中,可以使用该功能根据不同的状态(即选定或未选定)绘制椅子。您可以将椅子的状态存储在内存中的一维或二维数组中,然后使用“绘制”方法在其中循环以绘制每张椅子,并根据其“索引”计算椅子在屏幕上的位置:

for(int chairIndex = 0; chairIndex < chairsCount; chairIndex++)
{
  // compute the on-screen position of each chair
  chairX = (chairIndex % chairsPerLine) * chairWidh;
  chairY = (chairIndex / chairsPerLine) * chairHeight;

  // and read the current state from the array
  chairState = chairsArray[chairIndex];

  // then draw the chair image in the graphics context
  switch(chairState)
  {
     case /* SELECTED */
       .. DrawImage(selectedImage, new Point(chairX, chairY));
     case /* NOT-SELECTED */
       .. DrawImage(nonSelectedImage, new Point(chairX, chairY));
  }
}

上面的代码片段假设您之前定义了一些变量,将不同的椅子图像加载到两个或多个变量中,并使用一维数组存储椅子状态。

您使用的是WinForms还是WPF?椅子状图像有多大?尚未决定,我假设它非常小,比如16x16px
for(int chairIndex = 0; chairIndex < chairsCount; chairIndex++)
{
  // compute the on-screen position of each chair
  chairX = (chairIndex % chairsPerLine) * chairWidh;
  chairY = (chairIndex / chairsPerLine) * chairHeight;

  // and read the current state from the array
  chairState = chairsArray[chairIndex];

  // then draw the chair image in the graphics context
  switch(chairState)
  {
     case /* SELECTED */
       .. DrawImage(selectedImage, new Point(chairX, chairY));
     case /* NOT-SELECTED */
       .. DrawImage(nonSelectedImage, new Point(chairX, chairY));
  }
}
// compute chairIndex based on mouse position (for hit-test)
chairIndex = mouseX / chairWidth + (mouseY / chairHeight) * chairsPerLine;
// then toggle state accordingly