C # WinForms Рисование без просмотра - PullRequest
0 голосов
/ 28 сентября 2011

Друг девяти подал мне идею для буферизации: просмотреть чертеж после завершения процесса рисования. Он сказал мне нарисовать на графике (панель в данном случае), которая невидима для пользователя. Но когда процесс рисования завершен, рисунок наносится на панель. Другими словами, это все равно что рисовать картинку, не показывая ее никому, пока она не закончится.

Я попробовал это. Но я делаю это неправильно. Сначала я рисую панель, которая только объявлена ​​(в коде нет строк, которые изменяют ее свойства). После этого я пытаюсь применить новый рисунок к видимой панели, используя "gfx = RealPanel.CreateGraphics ();" Но это только делает новую графику на панели ... Да, я делаю это неправильно. Я понятия не имею, как это сделать правильно.

В моем случае есть панель, которая в один момент заполняется линиями и квадратами. Панель также принадлежит другой панели. Первая панель не может быть уменьшена вместе со всем окном, но вторая панель может. Когда размер панели № 2 изменяется, и она меньше, чем панель № 1, начинается мерцание. Свойство автоматической прокрутки второй панели имеет значение «true», и при прокрутке тоже мерцает.

Пожалуйста, не пытайтесь указывать мне использовать двойную буферизацию. Я попытался «разблокировать» свойство двойной буферизации панели. И я попробовал все методы, описанные здесь: Winforms Double Buffering ... Ничего не меняет для меня. И я хочу попробовать эту идею.

Итак, как я могу сделать это правильно?

Спасибо!

1 Ответ

4 голосов
/ 30 сентября 2011

Вам никогда не придется использовать CreateGraphics.

Панель с двойной буферизацией должна исправить это.Не используйте его на своей «скрытой» панели.Возможно, вам следует избавиться от скрытой панели и просто использовать новую панель управления.Если у вас все еще возникают проблемы с мерцанием, то вам следует отредактировать свой вопрос и опубликовать код, который вызывает блокировку.

public class PanelEx : Panel
{
  public PanelEx()
  {
    this.DoubleBuffered = true;
  }
}

Если вы все еще хотите сделать свою собственную «скрытую» двойную буферизацию, тогда вы делаете этопрямо на вашем собственном растровом изображении:

Bitmap bm = new Bitmap(width, height);

Затем сделайте ваш рисунок следующим образом:

using (Graphics g = Graphics.FromImage(bm))
{
  //Draw stuff
}

В вашем событии рисования Panels все, что вы делаете, это:

private void panel1_Paint(object sender, PaintEventArgs e)
{
  e.Graphics.DrawImage(bm, 0, 0);
}

Когда вам нужно обновить экран, просто отключите панель:

panel1.Invalidate();

, которая скажет вашей программе вызвать событие рисования.

...