Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > мерцание изображение


Автор: chudak 4.3.2008, 02:42
почитал тут как с мерцанием справиться, непомогает!!!
может я чего нетак сделал??? 

Код

 public partial class general : Form
    {
        public general()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form_Paint);
            this.panel1.BackColor = System.Drawing.Color.FromArgb(100,0,0);
            
        }       
        Bitmap bmp;
        Graphics gr;
        private void button1_Click_1(object sender, EventArgs e)
        {
            bmp = new Bitmap(700, 450);
            gr = Graphics.FromImage(bmp);
            if (openFileDialog1.ShowDialog() != DialogResult.Cancel)
            {
                
                string name_file = openFileDialog1.FileName;
                Image im_f =Image.FromFile(name_file);
                gr.DrawImage(im_f, new Rectangle(1, 1, 400, 400));
                Invalidate();
            }
        }
        private void Form_Paint(object sender, PaintEventArgs e)
        {
            panel1.BackgroundImage = bmp;
        }
        Bitmap bmp_clon;
        private void vScrollBar1_ValueChanged(object sender, EventArgs e)
        {
            bmp_clon = bmp.Clone(new Rectangle(vScrollBar1.Value, vScrollBar1.Value, 200, 200), System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            panel1.BackgroundImage = bmp_clon;
            panel1.Invalidate();
        }

    }


данный код просто тренировачный, и смысловой нагрузки не несет!!!

скажите что еще сделать чтобы не мерцала при прокрутки скролла!!!

Заранее спасибо!!!

Автор: Alekz 4.3.2008, 12:31
Уже было:
http://forum.vingrad.ru/forum/topic-198749/kw-%D0%BC%D0%B5%D1%80%D1%86%D0%B0%D0%BD%D0%B8%D0%B5.html

Автор: chudak 5.3.2008, 19:33
ничего не выходит, форма без наваротов, мерцание прежнее!!!

Код

    public partial class general : Form
    {
        public general()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.Form_Paint);
            this.panel1.BackColor = System.Drawing.Color.FromArgb(100,0,0);

        }       
        Bitmap bmp;
        Graphics gr;
        Bitmap bmp_clon;
        private void button1_Click_1(object sender, EventArgs e)
        {
            bmp = new Bitmap(700, 450);
            gr = Graphics.FromImage(bmp);
            if (openFileDialog1.ShowDialog() != DialogResult.Cancel)
            {
                
                string name_file = openFileDialog1.FileName;
                Image im_f =Image.FromFile(name_file);
                gr.CompositingQuality = CompositingQuality.HighSpeed;
                gr.InterpolationMode = InterpolationMode.NearestNeighbor;
                gr.SmoothingMode = SmoothingMode.HighSpeed;
                gr.DrawImage(im_f, new Rectangle(1, 1, 400, 400));

                Invalidate();
            }

        }
        private void Form_Paint(object sender, PaintEventArgs e)
        {
            if(bmp != null)
            {
            bmp_clon = bmp.Clone(new Rectangle(vScrollBar1.Value, vScrollBar1.Value, 200, 200), System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
            }
        }

        private void vScrollBar1_ValueChanged(object sender, EventArgs e)
        {
            panel1.BackgroundImage = bmp_clon;
            panel1.Refresh();
        }

    }


что делать?

Автор: Crimp 6.3.2008, 10:33
вместо
 
Код

private void vScrollBar1_ValueChanged(object sender, EventArgs e)
        {
            panel1.BackgroundImage = bmp_clon;
            panel1.Refresh();
        }

сделай override OnPaint. и  Refresh(); очень тяжелая операция, используй Invalidate();

Автор: chudak 6.3.2008, 13:04
попрежнему мерцает smile
а самое отвратительное то, что я непонимаю почему

Автор: zaver 11.3.2008, 01:23
Цитата(chudak @ 6.3.2008,  13:04)
попрежнему мерцает smile
а самое отвратительное то, что я непонимаю почему
  • Чуток омогает уменьщить мерцание - буферизация прорисовки. смысл в том, что ты рисуешь на объекте BitMap  тех=же размеров что и форма, а после того как нарисуешь все линии, кружочки и прочее рисуешь этот BitMap на свою форму. мерцание снижается из-а того, что ты каждый раз когда ты рисуешь хотя бы одну точку на форме она мигает, если ты будешь делать это в виртуальном рисунке, а потом переносить его на форму, то мигать будет только один раз. 
  • Если форма большая, и ей придеться часто перерисовываться (например часто тягаешь по экрану), то мигать всеравно будет часто (такой уж GDI+). В этом случае поможет, если ты откючишь перерисовку формы и будешь перерисовывать ее в отдельном потоке, который например будет перерисовывать каждые 100мс-будут мелкие "неприятности" на форме, но зато она не будет тормозить.

Добавлено через 1 минуту и 24 секунды
я больше люблю первый вариант, второй сильно сложный для такой маленькой проблемы

Автор: Experimenter 11.3.2008, 14:42
chudak, создай маленький класс панели:
Код

#region " Класс панели "
    сlass ExchangePanel : Panel
    {
        public ExchangePanel()
        {
            this.DoubleBuffered = true;
        }
    }
#endregion
Смысл в том, что свойство DoubleBuffered скрыто, когда обычную панель на форме создаешь и по умолчанию оно false.
Потом, в методе Invalidate() есть перегрузка Invalidate(Rectangle rect). Используй ее для перерисовки только видимой части панели.

Автор: Егоша 7.4.2008, 22:26
Цитата(zaver @ 11.3.2008,  01:23)

[*]Если форма большая, и ей придеться часто перерисовываться (например часто тягаешь по экрану), то мигать всеравно будет часто (такой уж GDI+). В этом случае поможет, если ты откючишь перерисовку формы и будешь перерисовывать ее в отдельном потоке, который например будет перерисовывать каждые 100мс-будут мелкие "неприятности" на форме, но зато она не будет тормозить.


Вопрос, а как тогда в поток передать e.Graphics основной формы ? Как сататическое поле его хранить и обновлять в OnPaint - не получилось, я так понял из-за того что часто обновляется обьект Graphics и возникает конфликт... 

Автор: vponomarov 8.4.2008, 09:21
можно вместо вызова Invalidate() напрямую вызывать метод перерисовки
мерцание возникает из-за того, что Invalidate() полностью очищаетизображение, а потом уже оно перерисовывается.
если напрямую вызывать перерисовку, то очистки происходить не будет, будет рисовать по-верх старого изображения.
если при перерисовке старое изображение полностью накрывается новым, то проблем с артефактами не будет smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)