2010-01-04 84 views
2

我必須創建一個能夠顯示電影院(不知道確切的詞)架構的表單。從本質上講,我必須顯示大量(由另一個來源給出的)獨立的椅子狀圖像,這些圖像可以在點擊時改變顏色(狀態)。動態顯示數百個圖像

我在網上衝浪搜索解決方案,但我真的不知道如何管理這個。 有人可以幫我嗎?

+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

回答

8

如果您需要繪製許多圖像,最好的辦法是使用面板控件並通過處理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

0

我想說最簡單的方法是創建並擁有處理它的點擊事件等的「椅子控制」。這只不過是一個簡單的用戶定義控件,它將椅子圖像作爲背景並在必要時與其他圖片交換)。

之後,你可以很容易地創建通過代碼這些控件的大沖(僞代碼):

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

構造函數的行數和列數,並自動調整它的位置,FE

0

我會添加到鮑比的答案,控制應該真正預渲染圖像到一個位圖,並使用它來刷新屏幕。更新位圖以反映用戶更改。

0

也有數以百計的解決方案:D。 例如,您可以將它們排列成一個布爾值網格,其中包含用於繪製椅子的單元格的自定義繪畫以及用於更改綁定到網格的列表/數據集狀態的單元格單擊事件。