Форма Windows, отображение индикатора над динамически генерируемым растровым изображением - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть пользовательский элемент управления, который отображает градиент цветов, который после создания будет постоянным.

Usercontrol не содержит никаких элементов управления, не уверен, нужно ли мне добавлять изображение или динамически добавлять его.

Над этим изображением я хотел бы отобразить строку, которая будет отображать текущий результат. У меня нет проблем с созданием градиентного изображения на карте, однако я бы хотел как-то его кэшировать, чтобы каждый раз, когда я обновлял индикатор (вызывал 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();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

Во-первых, я бы предложил установить для свойства элемента управления DoubleBuffered значение True, чтобы мерцание исчезло.Однако, если вы не используете сам элемент управления, это будет бесполезно.Однако лучше рисовать на PictureBox, потому что оно автоматически DoubleBuffered.

Во-вторых, вы каждый раз рисуете в Bitmap, что очень плохо с точки зрения памяти, так какBitmap имеет размер несколько мегабайт.Я бы посоветовал вам инициализировать один Bitmap в конструкторе и один Graphics, созданный из этого Bitmap в конструкторе.Каждый раз, когда paint появляется, просто очищайте старый Graphics g, а затем снова и снова рисуйте на нем.g Graphics и b Bitmap должны быть Dispose d только один раз, когда весь элемент управления равен Dispose d.

Это может повлиять на ваш код.

0 голосов
/ 14 сентября 2011

Объяснено выше в комментариях, используется растровое изображение и просто задается x, y элемента управления.

...