2016-12-21 47 views
0

對不起,如果這已被問到。單擊按鈕時調用涉及PaintEventArgs的函數

我在C#Windows窗體一個簡單連接4個遊戲工作,我沒有做之前,包括圖形的任何工作。爲此,我需要程序在按下按鈕時繪製圓圈,但我不知道如何調用此功能。

public void printToken(PaintEventArgs pe, int x) 
    { 
     Graphics g = pe.Graphics; 
     Pen blue = new Pen(Color.Blue); 
     Pen red = new Pen(Color.Red); 

     Rectangle rect = new Rectangle(50 + ((x-1) * 100), 50, 50, 50); 
     g.DrawEllipse(blue, rect); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     printToken(null, 1); 
    } 

null就位只是一個佔位符,顯然不起作用。

任何和所有的幫助表示讚賞。

+0

您需要處理**的paint()**事件無論您想要控制什麼樣的控制,並使用通過'e.Graphics'參數在該事件中提供給您的圖形。您可以存儲關於在Class級別繪製什麼的信息,然後通過調用其Refresh()方法強制控件繪製自己。 –

+0

您必須使用容器或表單的Paint事件,並使用由此提供的Graphic對象。要更新圖形,只需在容器上調用Invalidate()。在繪畫事件本身中,您只需繪製事物的當前狀態,因此如果需要繪製令牌,則變量或列表需要該信息。 – LarsTech

+0

我有點理解你在說什麼,但我不知道我是如何將它全部實現到代碼中的。我對這種類型的東西很陌生。 –

回答

1

通常,在Windows窗體,你想要做自定義繪圖應用程序,無論是在Paint事件處理程序直接畫上一個FormPictureBox或創建您覆蓋OnPaint方法Control一個子類。在Paint事件處理程序或OnPaint,你畫一切(即不只是一個圈子,但所有的圓圈)。那麼當你的基礎數據結構的變化,表明你需要一個重繪,你叫Invalidate()上的控制,其標記爲需要重繪,並於下一次通過事件循環,你Paint事件處理程序將運行或者你OnPaint方法叫做。在該方法中,您將獲得需要獲取Graphics對象的PaintEventArgs對象,以便執行繪製。你不想「畫一次又忘記」(例如,當點擊一個按鈕時),因爲有各種各樣的事情可能導致你的控件需要重新繪製自己。有關更多詳情,請參閱this question and answer

編輯:這裏的一些手把手響應您的評論。 (這將是一個評論,但它太長了。)

如果我現在假設你在Visual Studio的Windows窗體設計器中以空白Form開頭,最快的方法就是要選擇Form,並在VS的「屬性」窗格中單擊閃電工具欄按鈕以查看窗體的事件。向下滾動至Paint事件,然後雙擊標籤右側空白處的任意位置。這將連接表單的一個Paint事件處理程序,並帶您到表單的代碼文件中新添加的方法。使用PaintEventArgs對象e進行繪製。然後,如果您需要更改點擊某個按鈕時得到的內容,請在您的點擊處理程序中更改確定繪製內容的數據(例如播放作品的位置和顏色),並在完成後調用Invalidate()

+0

我不知道如何將這個實現到我當前的代碼中,我對這個東西有點小氣。 –

+0

我用一個快速教程擴展了我的答案。 – adv12

+0

明白了!感謝您的幫助,您鏈接的其他頁面也非常有用。 –

0

如果添加代表單個芯片的形式的用戶控件,並重寫OnPaint方法,把着色代碼到該事件,那麼Graphics對象將不能爲空當塗料事件觸發。

揭開序幕的用戶控件的油漆,或者調用Refresh方法或InvalidateRectangle方法 - 要麼將觸發OnPaint方法。

確保先調用類層次結構的OnPaint中,以確保該對象的背景是首先繪製:

protected override void OnPaint(PaintEventArgs e) { 
    base.OnPaint(e); 
    Graphics g = e.Graphics; 
     Pen blue = new Pen(Color.Blue); 
     Pen red = new Pen(Color.Red); 
     Rectangle rect = new Rectangle(50 + ((x-1) * 100), 50, 50, 50); 
     g.DrawEllipse(blue, rect); 

}