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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с BufferedGraphics 
V
    Опции темы
Robomozg
Дата 9.10.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не могу понять в чем проблема. Пытаюсь избавиться от мерцания с помощью BufferedGraphics. Первый раз использую этот класс. Подскажите что делаю не так. И можно поподробней объяснить как работать с этим классом. 

Код

/*Создаю в общем такую вещь*/
...
        public BufferedGraphics graf_buf;
        public BufferedGraphicsContext buf_context;
        public Graphics grWork;

        public void CreateGrafix()
        {
            this.buf_context = BufferedGraphicsManager.Current;
            this.buf_context.MaximumBuffer = new Size(GamePictBox.Width, GamePictBox.Height);
            this.graf_buf = buf_context.Allocate(GamePictBox.CreateGraphics(), new Rectangle(new Point(0, 0),      new Size(GamePictBox.Width, GamePictBox.Height)));
            this.grWork = graf_buf.Graphics;
        }
...
public void Package_Move()
        {
            Pen pen_black = new Pen(Color.Black, 2);
            Rectangle rect1 = new Rectangle(this.rect1_position, 255, 70, 80);
            Rectangle rect2 = new Rectangle(this.rect2_position, 255, 70, 80);
            this.grWork.DrawRectangle(pen_black, rect1);
            if(this.flag)
                this.grWork.DrawRectangle(pen_black, rect2);
            pen_black.Dispose();
        }
...
private void GamePictBox_Paint(object sender, PaintEventArgs e)
        {
        CreateGrafix();
            Package_Move();
            graf_buf.Render();
        }
...


PM MAIL   Вверх
Certain
Дата 10.10.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Подсказать по этому классу ничего не могу, не использовал! От мерцания можно избавиться способом по проще, любой контрол имеет свойство DoubleBuffered (только оно protected)
Код

public class GraphicPanel : Panel
{
      public GraphicPanel() : base()
      {
            base.DoubleBuffered = true;
      }
}


Если ресуешь на самой форме, то у формы есть свойство public DoubleBuffer
Проверено!

Это сообщение отредактировал(а) Certain - 10.10.2008, 12:04
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
Dennnis
Дата 12.10.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



[/code]
Цитата(Robomozg @  9.10.2008,  10:41 Найти цитируемый пост)
Не могу понять в чем проблема.

Криво все написано. Даже не охота разбираться smile . Вот это работает:
Код

        ...
        public BufferedGraphics bufferedGraphics;
        public BufferedGraphicsContext bufferedGraphicsContext;

        public Form1()
        {
            InitializeComponent();
            this.bufferedGraphicsContext = BufferedGraphicsManager.Current;
            this.bufferedGraphicsContext.MaximumBuffer = new Size(Width, Height);
            this.bufferedGraphics = bufferedGraphicsContext.Allocate(CreateGraphics(), new Rectangle(new Point(0, 0), new Size(Width, Height)));
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Rectangle rect1 = new Rectangle(10, 10, 100, 100);
            Rectangle rect2 = new Rectangle(50, 50, 150, 150);
            bufferedGraphics.Graphics.DrawRectangle(Pens.Red, rect1);
            bufferedGraphics.Graphics.DrawRectangle(Pens.Blue, rect2);
            bufferedGraphics.Render();
        }
        ...

--------------------
Get Rich or Die Tryin'
PM   Вверх
Robomozg
Дата 13.10.2008, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо всем!!!  smile 
PM MAIL   Вверх
Freya
Дата 13.10.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попробую немного пояснить...
Если не ошибаюсь, то мерцание возникает в результате того, что на событие Invalidate происходит двойная прорисовка - сначала BackGround, а потом основной рисунок. Таким образом, мерцание происходит из-за (ненужной) EraseBackGround.
У меня была задача, где возникала проблема мерцания, и решить её с помощью двойной буферизации не удалось, так как нужна была высокая скорость прорисовки. Я уже писала, что GDI+ достаточно медленная. И свою проблему я решала с помощью BitBtl (GDI) - никакого мерцания и никакого EraseBackGround.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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