C# Windows窗体,在动态生成的位图上显示指示器
我有一个用户控件,它显示颜色的渐变,一旦创建,渐变将是恒定的 usercontrol不包含任何控件,不确定是否需要添加picturebox或动态添加picturebox 在该图像上,我想显示一行,显示当前结果。我在地图上创建渐变图像没有问题,但是我想以某种方式缓存它,这样每当我从父窗体更新指示符调用CurrentValue时,它都会将指示符行放在渐变图像上方。这是每秒更新30次,因此,下面的代码是如何工作的,它每次都在重新绘制渐变,这是闪烁的 下面是一个代码示例:C# Windows窗体,在动态生成的位图上显示指示器,c#,winforms,graphics,gdi+,C#,Winforms,Graphics,Gdi+,我有一个用户控件,它显示颜色的渐变,一旦创建,渐变将是恒定的 usercontrol不包含任何控件,不确定是否需要添加picturebox或动态添加picturebox 在该图像上,我想显示一行,显示当前结果。我在地图上创建渐变图像没有问题,但是我想以某种方式缓存它,这样每当我从父窗体更新指示符调用CurrentValue时,它都会将指示符行放在渐变图像上方。这是每秒更新30次,因此,下面的代码是如何工作的,它每次都在重新绘制渐变,这是闪烁的 下面是一个代码示例: namespace Maps.
namespace Maps.UserControls
{
public partial class UserControlLegend : UserControl
{
private double m_CurrentValue;
public double CurrentValue
{
get
{
return m_CurrentValue;
}
set
{
m_CurrentValue = value;
RefreshValue();
}
}
public UserControlLegend()
{
InitializeComponent();
}
private void UserControlLegend_Paint(object sender, PaintEventArgs e)
{
if (b == null)
{
g = e.Graphics;
b = new System.Drawing.Bitmap(menuWidth, menuHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
// Code here that draws Menu
// Cache bitmap here?
g.Dispose();
}
}
private void RefreshValue()
{
this.Refresh();
g = this.CreateGraphics();
g.DrawImage(b, 0, 0);
//Code to Calcuate current Indicator Location
int x3 = 0;
// Draws current indicator correctly
g.DrawLine(new Pen(new SolidBrush(Color.Black)), this.Width / 2 - 15, x3, this.Width / 2 - 5, x3);
g.Dispose();
}
}
}
上面在注释中解释过,使用了位图,只需设置控件的x,y。首先,我建议您将控件的属性DoubleBuffered设置为True,这样闪烁就会消失。但是,如果您不使用控件本身,那将毫无用处。不过,在PictureBox上绘图更好,因为它是自动双缓冲的 其次,每次都要绘制一个新的位图,这在内存方面非常糟糕,因为位图的大小只有几兆字节。我建议您在构造函数中初始化一个位图,并在构造函数中根据该位图创建一个图形。每次油漆累积时,只需清除旧图形g,然后一次又一次地在其上绘制。当处理整个控件时,g图形和b位图应仅处理一次
这可能是你的密码。我猜出来了。我画了位图,只是用另一个控件作为指示器,然后将位置移动到我想要的位置。效果很好。