Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> мерцание изображение 
:(
    Опции темы
chudak
Дата 4.3.2008, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2008

Репутация: нет
Всего: нет



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

Код

 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();
        }

    }


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

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

Заранее спасибо!!!
PM MAIL   Вверх
Alekz
Дата 4.3.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 5.2.2008
Где: Запорожье, Украин а

Репутация: 1
Всего: 2



PM MAIL   Вверх
chudak
Дата 5.3.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2008

Репутация: нет
Всего: нет



ничего не выходит, форма без наваротов, мерцание прежнее!!!

Код

    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();
        }

    }


что делать?
PM MAIL   Вверх
Crimp
Дата 6.3.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 21.10.2007
Где: Tula

Репутация: нет
Всего: 2



вместо
 
Код

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

сделай override OnPaint. и  Refresh(); очень тяжелая операция, используй Invalidate();
PM MAIL ICQ   Вверх
chudak
Дата 6.3.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 2.1.2008

Репутация: нет
Всего: нет



попрежнему мерцает smile
а самое отвратительное то, что я непонимаю почему
PM MAIL   Вверх
zaver
Дата 11.3.2008, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: 1
Всего: 3



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

Добавлено через 1 минуту и 24 секунды
я больше люблю первый вариант, второй сильно сложный для такой маленькой проблемы
PM MAIL WWW ICQ Skype YIM MSN   Вверх
Experimenter
Дата 11.3.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 4
Всего: 17



chudak, создай маленький класс панели:
Код

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



--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Егоша
Дата 7.4.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.3.2008

Репутация: нет
Всего: нет



Цитата(zaver @ 11.3.2008,  01:23)

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


Вопрос, а как тогда в поток передать e.Graphics основной формы ? Как сататическое поле его хранить и обновлять в OnPaint - не получилось, я так понял из-за того что часто обновляется обьект Graphics и возникает конфликт... 
PM MAIL   Вверх
vponomarov
Дата 8.4.2008, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 2
Всего: 12



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


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0780 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.