我必须创建一个能够显示影院大厅(不知道确切的单词)架构的表单。基本上我必须显示大量(由另一个来源给出)独立的椅子状图像,这些图像可以在点击时改变颜色(状态)。
我在网上搜索解决方案,但我真的不知道如何管理它。 有人能帮助我吗?
答案 0 :(得分:8)
如果您需要绘制那么多图像,最好的办法是使用面板控件并通过处理OnPaint事件或者更好的方式自己处理绘图:创建一个继承自Panel控件并覆盖Paint的自定义控件方法。在线查看如何在.NET中创建自定义绘制控件的示例。
不要尝试使用Image控件或其他此类控件创建数百个图像,因为它会增加很多开销。
在Paint方法中,您可以使用DrawImage功能根据不同的状态(即选中或未选中)绘制椅子。您可以将椅子的状态存储在内存中的一维或二维数组中,然后在Paint方法中循环绘制每个椅子,根据其索引在屏幕上计算椅子的位置:
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
上面的代码片段假设您之前已经定义了一些变量,您已将不同的椅子图像加载到两个或更多变量中,并且您正在使用一维数组来存储椅子的状态。
答案 1 :(得分:0)
我会说最简单的方法是创建并拥有“主席控制”来处理它的点击事件等。这只不过是一个简单的用户定义控件,它将椅子图像作为背景(和如有必要,可与其他图片交换。
之后,您可以通过代码(伪代码)轻松创建这些控件的重要部分:
for(int row = 0; row < rowMax; row++) {
for(int column = 0; column < columnMax; column++) {
this.Controls.Add(New ChairControl(row, column));
}
}
构造函数获取行号和列号并自动调整它的位置,f.e ..
答案 2 :(得分:0)
我想补充说Bobby的答案是控件应该将图像预先渲染到单个位图并使用它来刷新屏幕。更新位图以反映用户更改。
答案 3 :(得分:0)
也有数百种解决方案:D。 例如,您可以将它们排列成一个布尔网格,其中包含用于绘制椅子的单元格的自定义绘制,以及用于单击单元格的事件,用于更改绑定到网格的列表/数据集的状态。