动态显示数百个图像

问题描述:

我必须创建一个能够显示电影院(不知道确切的词)架构的表单。从本质上讲,我必须显示大量(由另一个来源给出的)独立的椅子状图像,这些图像可以在点击时改变颜色(状态)。动态显示数百个图像

我在网上冲浪搜索解决方案,但我真的不知道如何管理这个。 有人可以帮我吗?

+0

您是使用WinForms还是WPF? – SLaks 2010-01-04 14:23:09

+0

目前Winforms – Abaco 2010-01-04 14:24:03

+0

椅子般的图像有多大? – 2010-01-04 14:24:20

如果您需要绘制许多图像,最好的办法是使用面板控件并通过处理OnPaint事件或者更好地自己处理绘图:创建一个自定义控件,该控件继承Panel控件并覆盖涂料方法。在线查看如何在.NET中创建自定义绘制控件的示例。

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

在Paint方法中,您可以使用DrawImage函数根据不同状态(即选定或不选)绘制椅子。您可以将椅子的状态存储在内存中的一维或二维数组中,然后在“绘画”方法中循环绘制每把椅子,根据其索引计算椅子的位置:

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 

的代码片段假设你已经先前定义一些变量,即加载了不同椅子图像划分成两个或更多的变量,并且您使用的一维阵列,用于存储主席说。

+0

谢谢,我解决了我的问题。 – Abaco 2010-01-04 16:39:31

+0

很酷。别客气! – 2010-01-04 17:22:31

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

之后,你可以很容易地创建通过代码这些控件的大冲(伪代码):

for(int row = 0; row < rowMax; row++) { 
    for(int column = 0; column < columnMax; column++) { 
     this.Controls.Add(New ChairControl(row, column)); 
    } 
} 

构造函数的行数和列数,并自动调整它的位置,FE

我会添加到鲍比的答案,控制应该真正预渲染图像到一个位图,并使用它来刷新屏幕。更新位图以反映用户更改。

也有数以百计的解决方案:D。 例如,您可以将它们排列成一个布尔值网格,其中包含用于绘制椅子的单元格的自定义绘画以及用于更改绑定到网格的列表/数据集状态的单元格单击事件。