2010-04-17 32 views
2

我想在c#中創建這個簡單的應用程序:當用戶雙擊表單中的特定位置時,會繪製一個小圓圈。只需點擊一下,如果當前位置用圓圈標記 - 圓圈將被刪除。在.NET中控制位圖的可見性

我試圖通過簡單的註冊MouseDoubleClick和鼠標點擊事件,要做到這一點,並從一個.bmp文件畫圓方式如下:

private void MouseDoubleClick (object sender, MouseEventArgs e) 
{ 
    Graphics g = this.CreateGraphics(); 
    Bitmap myImage = (Bitmap)Bitmap.FromFile("Circle.bmp"); 
    g.DrawImage(myImage, e.X, e.Y); 
} 

我的問題是,我不知道該怎麼做當用戶點擊它的位置時,圓圈是不可見的:我知道如何檢查所選位置是否包含圓圈(通過管理所有位置包含圓圈的列表...),但我不知道如何刪除它。

另一個問題:我應該調用this.CreateGraphics()方法每次用戶雙擊一個位置,就像我在我的代碼片段中寫的,或者我應該在初始化時調用它一次嗎?

回答

2

我個人的偏好是將我的圖像放在Picturebox類的實例中。原因是,我可以簡單地調用每個Picturebox的Hide()函數(或將'Visible`設置爲false)。

你在做什麼是將直接繪製到窗口的客戶區,這在技術上沒有錯,但通常應該在窗體的Paint處理程序中完成。如果在某個時候您決定不再希望您的圈子可見,則可以調用觸發Paint事件的窗體的Invalidate()方法。在那裏,你顯然不畫你的圈子,所以對用戶來說,圈子消失了。

關於Picturebox的好處在於它是持久的 - 您將圖像放入其中並可選擇繪製該圖像,但您只需繪製一次。如果使用Paint處理器技術,則每次表單需要重繪時都會調用繪圖代碼。

編輯:

下面是一些代碼,說明我的油漆處理信息:

private void Form_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.Clear(); // clear any and all circles being drawn 

    if (CircleIsVisible) 
    { 
    e.Graphics.DrawEllipse(...); // OR, DrawImage() as in your example 
    } 
} 

private void MouseDoubleClick (object sender, MouseEventArgs e) 
{ 
    CircleIsVisible = true; 
    Invalidate(); // triggers Paint event 
} 

如果您繪製的位圖,我想一旦加載位圖並將其存儲爲一個類變量。這樣,您不需要在每次想要繪製的時候都打開硬盤。當你處理你的類(在這種情況下,你的窗口)時,處理位圖。

+0

感謝代碼片段,它聽起來像一個很好的解決方案。然而,我還有一個問題:我仍然喜歡使用位圖而不是DrawEllipse(),因爲我需要繪製圖標。現在,假設我有成千上萬的圖標,這種解決方案是否會損害性能?我的意思是,如果位圖存儲爲類成員,則Clear()和DrawImage()的成本是多少? – 2010-04-17 22:41:09

+0

自從Hun1Ahpu提到它之後,我只提到過DrawEllipse,而且我會這樣做,因爲我更喜歡管理代碼,而不是管理文件。 – 2010-04-18 01:06:02

+0

現在,至於性能,請考慮以下內容。我不確定現在平均硬盤驅動器的讀取和讀取時間是多少,但比從RAM中讀取要慢幾個數量級* *。總是存在一個記憶速度的折衷,這取決於你的目標是什麼。您可以將這些圖標添加到資源文件中 - 您的圖標將在運行時加載到內存中,這樣您的應用程序最初可能需要更長時間才能加載,但繪圖將會很快。 – 2010-04-18 01:10:36

0

我認爲你應該在下一次雙擊前清除你繪製的所有圖像。
如Graphics.Clear()。
另一方面,您不應該每次創建Graphics對象或進行處理。

0

如果你有簡單的背景顏色,你可以使用Graphics.DrawEllipse繪製圓形,然後將圓形顏色更改爲背景顏色。此外,您需要有一個您繪製的所有圈子的集合,以便您可以訪問您繪製的任何圈子。

+0

如果我使用背景圖片,或者我想繪製一些圖標而不是圓形,該怎麼辦? – 2010-04-17 22:20:31

+0

我只是猜測,如果你不是。您可以將此信息添加到您的問題 – Hun1Ahpu 2010-04-17 22:29:05

+0

您是對的。感謝你的迴應,當然,我沒有試圖冒犯。 – 2010-04-17 22:45:00

相關問題