2011-03-31 73 views
5

我正在制定一個日程安排,並用面板代表時間片,約會上面還有更多面板。C#在面板上繪圖

用戶可以上下滾動,以便他們可以看到的範圍先後移動。當約會在可見範圍的末端運行時,我希望有一個曲折形,表示約會超出了可見邊界。

我已經確定了發生這種情況的情況,並且我調用一個專用函數drawZigZag(Panel p, int direction);來繪製它。當天橫向擴展,方向-1指示左側曲折,1指示右側曲折。到目前爲止,我還沒有達到Z字形,我只是試驗CreateGraphics()FillPolygon()。到目前爲止,我有:

private void drawZigZag(Panel p, int direction) // 1 = right, -1 = left 
    { 
     Graphics g = p.CreateGraphics(); 

     g.FillRectangle(new SolidBrush(Color.FromArgb(0, Color.Black)), p.DisplayRectangle); 

     Point[] points = new Point[4]; 

     points[0] = new Point(0, 0); 
     points[1] = new Point(0, p.Height); 
     points[2] = new Point(p.Width, p.Height); 
     points[3] = new Point(p.Width, 0); 

     Brush brush = new SolidBrush(Color.DarkGreen); 

     g.FillPolygon(brush, points); 
    } 

第一個FillRectangle()我原本沒有。我只補充說,當FillPolygon()不起作用。

基本上,它不工作,我不知道爲什麼。面板是原始顏色 - 它沒有被填充DarkGreen。我之前使用過CreateGraphics()做了其他事情,但我不確定它爲什麼在這種情況下不起作用。有任何想法嗎?

編輯:對不起,我想我應該提到:我的Panel有幾個Label控件描述了約會。如果可能,這些不應包括在內。

+1

道歉,如果我完全不在這裏,但它看起來並不像控制權的失效/塗裝生命週期。例如訂閱/覆蓋有問題的控件的OnPaint事件等。 – lzcd 2011-03-31 23:39:21

+1

請記住,您的控件在任何需要更新時都會重新繪製。因此,如果您嘗試在某個時間點繪製您的控件,則會將其重新繪製爲正常外觀,以免看到您的更改。如果您想查看更改,則需要使用Paint事件註冊您的繪畫方法。 – 2011-04-01 00:02:52

回答

18

您需要從paint事件處理函數中調用此方法,而不僅僅是當您喜歡時。因此,在你的構造函數,你可能有:

panel1.Paint += new PaintEventHandler(panel1_Paint); 

,然後執行:

private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     var p = sender as Panel; 
     var g = e.Graphics; 

     g.FillRectangle(new SolidBrush(Color.FromArgb(0, Color.Black)), p.DisplayRectangle); 

     Point[] points = new Point[4]; 

     points[0] = new Point(0, 0); 
     points[1] = new Point(0, p.Height); 
     points[2] = new Point(p.Width, p.Height); 
     points[3] = new Point(p.Width, 0); 

     Brush brush = new SolidBrush(Color.DarkGreen); 

     g.FillPolygon(brush, points); 
    } 
1

例如,我們有這樣的描繪事件是從textBox1的繪製文本:

private void panel1_draw(object sender, PaintEventArgs e) 
    { 
     var g = e.Graphics; 
     Pen myp = new Pen(System.Drawing.Color.Red, 4); 
     Font fy = new Font("Helvetica", 10, FontStyle.Bold); 
     Brush br = new SolidBrush(System.Drawing.Color.Red); 
     g.DrawString(textBox1.Text, fy, br, 0,0); 
    } 

在爲了繪製您的panel1,您需要在您的按鈕事件處理函數中編寫此代碼:

private void button1_Click(object sender, EventArgs e) 
    { 
     panel1.Paint+=new PaintEventHandler(panel1_draw); 
     panel1.Refresh(); 
    } 

第一行在面板中繪製文本,如果希望文本出現,則必須刷新面板。 最主要的是使用panel1.Pain + = new PaintEventHandler(你的void名稱);和panel1.Refresh();