Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体,在动态生成的位图上显示指示器_C#_Winforms_Graphics_Gdi+ - Fatal编程技术网

C# Windows窗体,在动态生成的位图上显示指示器

C# Windows窗体,在动态生成的位图上显示指示器,c#,winforms,graphics,gdi+,C#,Winforms,Graphics,Gdi+,我有一个用户控件,它显示颜色的渐变,一旦创建,渐变将是恒定的 usercontrol不包含任何控件,不确定是否需要添加picturebox或动态添加picturebox 在该图像上,我想显示一行,显示当前结果。我在地图上创建渐变图像没有问题,但是我想以某种方式缓存它,这样每当我从父窗体更新指示符调用CurrentValue时,它都会将指示符行放在渐变图像上方。这是每秒更新30次,因此,下面的代码是如何工作的,它每次都在重新绘制渐变,这是闪烁的 下面是一个代码示例: namespace Maps.

我有一个用户控件,它显示颜色的渐变,一旦创建,渐变将是恒定的

usercontrol不包含任何控件,不确定是否需要添加picturebox或动态添加picturebox

在该图像上,我想显示一行,显示当前结果。我在地图上创建渐变图像没有问题,但是我想以某种方式缓存它,这样每当我从父窗体更新指示符调用CurrentValue时,它都会将指示符行放在渐变图像上方。这是每秒更新30次,因此,下面的代码是如何工作的,它每次都在重新绘制渐变,这是闪烁的

下面是一个代码示例:

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位图应仅处理一次


这可能是你的密码。

我猜出来了。我画了位图,只是用另一个控件作为指示器,然后将位置移动到我想要的位置。效果很好。