在 .Update() 调用后绘制到面板
Painting to panel after .Update() call
我在调用 panel.Update() 后立即尝试绘制到面板时遇到问题;
这是代码:
public void AddAndDraw(double X, double Y){
AddPoint (X, Y);
bool invalidated = false;
if (X > _master.xMaxRange) {
_master.Update ();
invalidated = true;
}
if (Y > _master.yMaxRange) {
_master.Update ();
invalidated = true;
}
if (!invalidated) {
_master.UpdateGraph (this);
} else {
_master.PaintContent ();
}
}
当 运行 这个问题时,我只看到已清除的面板,而不是我试图在 .PaintContent() 方法中绘制的内容。我已经尝试在面板上使用 .Invalidate() 和 .Refresh() 而不是 .Update()
关于如何解决这个问题有什么建议吗?
看来你的情况需要PictureBox
。
PBs
在这里很有趣,因为它们可以显示 三 层:
- 他们有一个
BackgroundImage
属性
- 他们有一个
Image
属性
- 因为大多数控件都有一个表面,您可以在
Paint
事件 中绘制
因为你需要一个固定的坐标轴,而且一直没有变化的图表和一个你想经常更新的点PB
似乎是为你量身定做的!
根据需要调用函数,当点改变时调用 PictureBox
!
上的 Invalidate()
Bitmap GraphBackground = null;
Bitmap GraphImage = null;
Point aPoint = Point.Empty;
private void Form1_Load(object sender, EventArgs e)
{
PictureBox Graph = pictureBox1; // short reference, optional
GraphBackground = new Bitmap(Graph.ClientSize.Width, Graph.ClientSize.Height);
GraphImage = new Bitmap(Graph.ClientSize.Width, Graph.ClientSize.Height);
// intial set up, repeat as needed!
Graph.BackgroundImage = DrawBackground(GraphBackground);
Graph.Image = DrawGraph(GraphImage);
}
Bitmap DrawBackground(Bitmap bmp)
{
using (Graphics G = Graphics.FromImage(bmp) )
{
// my little axis code..
Point c = new Point(bmp.Width / 2, bmp.Height / 2);
G.DrawLine(Pens.DarkSlateGray, 0, c.Y, bmp.Width, c.Y);
G.DrawLine(Pens.DarkSlateGray, c.X, 0, c.X, bmp.Height);
G.DrawString("0", Font, Brushes.Black, c);
}
return bmp;
}
Bitmap DrawGraph(Bitmap bmp)
{
using (Graphics G = Graphics.FromImage(bmp))
{
// do your drawing here
}
return bmp;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
// make it as fat as you like ;-)
e.Graphics.FillEllipse(Brushes.Red, aPoint.X - 3, aPoint.Y - 3, 7, 7);
}
我在调用 panel.Update() 后立即尝试绘制到面板时遇到问题; 这是代码:
public void AddAndDraw(double X, double Y){
AddPoint (X, Y);
bool invalidated = false;
if (X > _master.xMaxRange) {
_master.Update ();
invalidated = true;
}
if (Y > _master.yMaxRange) {
_master.Update ();
invalidated = true;
}
if (!invalidated) {
_master.UpdateGraph (this);
} else {
_master.PaintContent ();
}
}
当 运行 这个问题时,我只看到已清除的面板,而不是我试图在 .PaintContent() 方法中绘制的内容。我已经尝试在面板上使用 .Invalidate() 和 .Refresh() 而不是 .Update()
关于如何解决这个问题有什么建议吗?
看来你的情况需要PictureBox
。
PBs
在这里很有趣,因为它们可以显示 三 层:
- 他们有一个
BackgroundImage
属性 - 他们有一个
Image
属性 - 因为大多数控件都有一个表面,您可以在
Paint
事件 中绘制
因为你需要一个固定的坐标轴,而且一直没有变化的图表和一个你想经常更新的点PB
似乎是为你量身定做的!
根据需要调用函数,当点改变时调用 PictureBox
!
Invalidate()
Bitmap GraphBackground = null;
Bitmap GraphImage = null;
Point aPoint = Point.Empty;
private void Form1_Load(object sender, EventArgs e)
{
PictureBox Graph = pictureBox1; // short reference, optional
GraphBackground = new Bitmap(Graph.ClientSize.Width, Graph.ClientSize.Height);
GraphImage = new Bitmap(Graph.ClientSize.Width, Graph.ClientSize.Height);
// intial set up, repeat as needed!
Graph.BackgroundImage = DrawBackground(GraphBackground);
Graph.Image = DrawGraph(GraphImage);
}
Bitmap DrawBackground(Bitmap bmp)
{
using (Graphics G = Graphics.FromImage(bmp) )
{
// my little axis code..
Point c = new Point(bmp.Width / 2, bmp.Height / 2);
G.DrawLine(Pens.DarkSlateGray, 0, c.Y, bmp.Width, c.Y);
G.DrawLine(Pens.DarkSlateGray, c.X, 0, c.X, bmp.Height);
G.DrawString("0", Font, Brushes.Black, c);
}
return bmp;
}
Bitmap DrawGraph(Bitmap bmp)
{
using (Graphics G = Graphics.FromImage(bmp))
{
// do your drawing here
}
return bmp;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
// make it as fat as you like ;-)
e.Graphics.FillEllipse(Brushes.Red, aPoint.X - 3, aPoint.Y - 3, 7, 7);
}