C# 在面板上绘图

11

我正在制定一份日程表,用面板表示时间段,而约会则是在其上方的另一个面板。

用户可以上下滚动以移动可见范围。当约会超出可见范围时,我想要有一个Zig-Zag指示它延伸到可见范围之外。

我已经确定了这种情况,然后调用私有函数drawZigZag(Panel p, int direction);来进行绘制。天数水平展开,方向-1表示左侧的zigzag,1表示右侧的zigzag。

目前为止,我还没有涉及到绘制Zig-Zag,我正在尝试使用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控件,描述了预约。如果可能的话,这些控件不应被覆盖。


1
抱歉,如果我完全错了,但是看起来你似乎没有绑定控件的无效/绘制生命周期。例如,订阅/覆盖相关控件的OnPaint事件等。 - lzcd
1
请记住,您的控件将会被重绘以便更新。因此,如果您尝试在某一时刻仅对控件进行绘制,那么它会被重绘回到其正常状态,因此您看不到您的更改。如果您想要看到自己的更改,需要使用Paint事件注册您的绘制方法。 - Jeff Mercado
2个回答

26

你需要从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 );
    }

2
例如,我们有一个绘图事件,从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.Paint += new PaintEventHandler(your void name); 和 panel1.Refresh();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接