C# 在面板上绘图

Posted

技术标签:

【中文标题】C# 在面板上绘图【英文标题】:C# Drawing on Panels 【发布时间】:2011-07-27 07:53:13 【问题描述】:

我正在制定一个日程表,并用小组来表示时间段,而约会则是更多的小组。

用户可以上下滚动,以便他们可以看到的范围提前或推迟。当约会超出可见范围的末端时,我希望有一个之字形表示约会超出了可见范围。

我已经确定了发生这种情况的情况,我调用了一个私有函数drawZigZag(Panel p, int direction); 来绘制它。一天是水平分布的,方向-1表示左边是锯齿形,1表示右边是锯齿形。

到目前为止,我还没有达到 zigzag 的水平,我只是在试验 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 控件描述了约会。如果可能,不应涵盖这些内容。

【问题讨论】:

抱歉,如果我在这里完全不合时宜,但看起来您并没有与控件的失效/绘制生命周期相关联。例如订阅/覆盖相关控件的 OnPaint 事件等。 请记住,您的控件将在需要更新时重新绘制。因此,如果您尝试在某个时候仅在控件上进行绘制,它将被重新绘制回正常外观,因此您将看不到您的更改。如果您想查看更改,则需要使用 Paint 事件注册您的绘制方法。 【参考方案1】:

您需要从绘制事件处理程序中调用此方法,而不仅仅是您喜欢的任何时候。所以在你的构造函数中你可能有:

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.Pain += new PaintEventHandler(your void name);和 panel1.Refresh();

【讨论】:

以上是关于C# 在面板上绘图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中有效地在桌面上绘图?

wxPython、PyQwt 或 C# 用于绘制图形并在绘图上手动绘制线条

在鼠标拖动C#上绘图时形状不可见

在 WinCE 平台上绘图,哪种语言更快:MFC VC++ 或 C#

R:如何在 R 3.2.1 中使用 lattice 并行化多面板绘图?

c#绘图控件哪个比较好,高手推荐个!