簡體   English   中英

C# 在面板上繪圖

[英]C# Drawing on Panels

我正在制定一天時間表並用面板表示時間段,而約會則是頂部的更多面板。

用戶可以上下滾動,以便他們可以看到的范圍更早或更晚地移動。 當約會超出可見范圍的末尾時,我希望有一個鋸齒形,表明約會超出了可見范圍。

我已經確定了發生這種情況的情況,並且我調用了一個私有函數drawZigZag(Panel p, int direction); 繪制它。 一天是水平分布的,方向 -1 表示左側的鋸齒形,1 表示右側的鋸齒形。

到目前為止,我還沒有達到鋸齒形,我只是在試驗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()不起作用時添加了它。

基本上,它不起作用,我不知道為什么。 面板是原始顏色 - 它沒有填充深綠色。 我之前已經將CreateGraphics()用於其他用途,但我不確定為什么它在這種情況下不起作用。 有任何想法嗎?

編輯:對不起,我想我應該提到:我的Panel上有幾個描述約會的Label控件。 如果可能,這些不應該被覆蓋。

您需要從繪制事件處理程序中調用此方法,而不僅僅是在您喜歡的時候。 所以在你的構造函數中你可能有:

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 );
    }

例如,我們有這個繪制事件,它從 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(your void name); 和 panel1.Refresh();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM