C#在面板上绘图

我正在制定一个日程安排并用面板代表时间段,并且约会更多的是面板。

用户可以向上和向下滚动,以便他们可以看到的范围更早或更晚。 当约会在可见范围的末尾运行时,我希望有一个曲折,表明约会超出了可见范围。

我已经确定了发生这种情况的情况,并且我调用了私有函数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()不起作用时。

基本上,它不起作用,我不知道为什么。 面板是原始颜色 – 它尚未填充DarkGreen。 我之前使用过CreateGraphics()用于其他事情,我不确定为什么它在这个实例中不起作用。 有任何想法吗?

编辑:对不起,我想我应该提一下:我的Panel上有几个Label控件来描述约会。 如果可能,不应涵盖这些内容。

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

例如,我们有这个绘图事件,它从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(你的虚名); 和panel1.Refresh();