Re[7]: Можно ли получить Bitmap из объекта Graphics ??
От: _Morpheus_  
Дата: 19.04.07 12:58
Оценка: 2 (1)
Здравствуйте, _Morpheus_, Вы писали:

_M_>Можно сделать по другому — создать Bitmap, рисовать в нем, а из OnPaint копировать битмап в Graphics.


вобщемто у тебя сейчас так и сделано, за исключением нескольких моментов:

1. Большая ошибка не освобождать Graphics. это приведет к утечке системных ресурсов. Graphics нужно использовать в using'е.
2. метод CreateBitmap возвращает Graphics, хотя называется CreateBitmap

Т.е. для такого варианта нужно делать так:
      private Bitmap _bmp = null;

      private void Form1_Load(object sender, System.EventArgs e)
      {
         // инициализация _bmp
         panel1_Resize(null, null);
         draw();
      }
      
      private void panel1_Resize(object sender, System.EventArgs e)
      {
         // размеры панели изменились - уничтожаем старый и делаем новый битамап
         if(_bmp!=null)
            _bmp.Dispose();
         _bmp = new Bitmap(panel1.Width, panel1.Height);
      }

      private void draw()
      {
         // рисуем в битмап
         if(_bmp!=null)
            using(Graphics g = Graphics.FromImage(_bmp))
            {
               g.Clear(Color.White);
               PaintHorizontalLine(g);
               PaintVerticalLine(g);
               PaintTaskWithOutControls(g);
            }
      }

      private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
      {
         // Когда панель рисует себя рисуем в панель картинку из битмапа
         if(_bmp!=null)
            e.Graphics.DrawImage(_bmp, 0, 0);
      }



однако все это делать лучше в отдельном контроле, тогда все будет более наглядно и будет больше возможностей.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[6]: Можно ли получить Bitmap из объекта Graphics ??
От: _Morpheus_  
Дата: 19.04.07 12:38
Оценка: 1 (1)
Здравствуйте, SlaVVVa, Вы писали:


SVV>нет это не подойдет,


подойдет. то как ты сделал это неправильно.

SVV>у меня было что-то подобное — мерцание в этом случае происходит т.к. графикс панели уже залит белым а сетка и объекты еще не прорисовались.

SVV>а теперь у меня делается по другоме — сначала рисуется новая картинка — потом она сразу помещается на панель, правда побочный эффект возникает — изменения на панели происходят с небольшой задержкой

эффект мерцания будет наблюдатся в том случае если ты рисуешь не из OnPaint.
Если ты рисуешь в OnPaint и проявляется мерцание, то достаточно включить свойство DoubleBuffered. В этом случае картинка рисуется не сразу на экране, а в памяти и лишь затем, когда ты уже все нарисовал выводится на экран.

Можно сделать по другому — создать Bitmap, рисовать в нем, а из OnPaint копировать битмап в Graphics.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Можно ли получить Bitmap из объекта Graphics ??
От: SlaVVVa Россия  
Дата: 19.04.07 08:12
Оценка:
Можно ли получить Bitmap из объекта Graphics ??

Проблема такая — при перерисовке panel формы, заметно мерцание. Можно ли в объект Вitmap поместить то, что в данный момент нарисовано на панели, а при следующей перерисовке подложить?

Подскажите кто знает, или возможно от мерцания по другому избаваться?
Поймете смысл — найдутся слова.
Катон.
Re: Можно ли получить Bitmap из объекта Graphics ??
От: _Morpheus_  
Дата: 19.04.07 10:20
Оценка:
Здравствуйте, SlaVVVa, Вы писали:

SVV>Можно ли получить Bitmap из объекта Graphics ??

SVV>Проблема такая — при перерисовке panel формы, заметно мерцание. Можно ли в объект Вitmap поместить то, что в данный момент нарисовано на панели, а при следующей перерисовке подложить?

думаю это не поможет — мерцание по всей видимости вызывает заливка панели.

SVV>Подскажите кто знает, или возможно от мерцания по другому избаваться?


попробуй включить свойство DoubleBuffered у панели
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: Можно ли получить Bitmap из объекта Graphics ??
От: SlaVVVa Россия  
Дата: 19.04.07 10:41
Оценка:
_M_>попробуй включить свойство DoubleBuffered у панели

Спасибо, за ответ.
Проблему удалось решить по другому

сначала прорисовываю
private Graphics CreateBitmap()
        {
            bm = new Bitmap(panel1.Width, panel1.Height);
            Graphics g = Graphics.FromImage(bm);
            g.Clear(Color.White);
            PaintHorizontalLine(g);
            PaintVerticalLine(g);
            PaintTaskWithOutControls(g);
            return g;
        }



потом заливаю на панель
Graphics gr = CreateBitmap();
            graphics.DrawImage(bm, 0, 0);
Поймете смысл — найдутся слова.
Катон.
Re[3]: Можно ли получить Bitmap из объекта Graphics ??
От: _Morpheus_  
Дата: 19.04.07 10:51
Оценка:
Здравствуйте, SlaVVVa, Вы писали:

_M_>>попробуй включить свойство DoubleBuffered у панели


SVV>Спасибо, за ответ.


для спасибо есть специальная кнопочка

SVV>Проблему удалось решить по другому


SVV>сначала прорисовываю

SVV>
SVV>private Graphics CreateBitmap()
SVV>        {
SVV>            bm = new Bitmap(panel1.Width, panel1.Height);
SVV>            Graphics g = Graphics.FromImage(bm);
SVV>            g.Clear(Color.White);
SVV>            PaintHorizontalLine(g);
SVV>            PaintVerticalLine(g);
SVV>            PaintTaskWithOutControls(g);
SVV>            return g;
SVV>        }
SVV>



SVV>потом заливаю на панель

SVV>
SVV>Graphics gr = CreateBitmap();
SVV>            graphics.DrawImage(bm, 0, 0);
SVV>


неправильно, сделай так:

private paintHandler(object sender, PaintEventArgs args)
{
    args.Graphics.Clear(Color.White);
    PaintHorizontalLine(args.Graphics);
    PaintVerticalLine(args.Graphics);
    PaintTaskWithOutControls(args.Graphics);
}


и подпишись этим методом на OnPaint панели
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[4]: Можно ли получить Bitmap из объекта Graphics ??
От: _Morpheus_  
Дата: 19.04.07 11:17
Оценка:
а вообще по правильному нужно делать так:

написать контрол, наследующий Panel (или UserControl) и перегрузить OnPaint:

   public class MyControl: Panel
   {
      public MyControl()
      {
         SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
      }
      
      protected override void OnPaint(PaintEventArgs e)
      {
         e.Graphics.Clear(Color.White);
         PaintHorizontalLine(e.Graphics);
         PaintVerticalLine(e.Graphics);
         PaintTaskWithOutControls(e.Graphics);
      }

      // ....
   }
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[5]: Можно ли получить Bitmap из объекта Graphics ??
От: SlaVVVa Россия  
Дата: 19.04.07 12:03
Оценка:
Здравствуйте, _Morpheus_, Вы писали:


_M_> protected override void OnPaint(PaintEventArgs e)

_M_> {
_M_> e.Graphics.Clear(Color.White);
_M_> PaintHorizontalLine(e.Graphics);
_M_> PaintVerticalLine(e.Graphics);
_M_> PaintTaskWithOutControls(e.Graphics);
_M_> }

нет это не подойдет, у меня было что-то подобное — мерцание в этом случае происходит т.к. графикс панели уже залит белым а сетка и объекты еще не прорисовались. а теперь у меня делается по другоме — сначала рисуется новая картинка — потом она сразу помещается на панель, правда побочный эффект возникает — изменения на панели происходят с небольшой задержкой
Поймете смысл — найдутся слова.
Катон.
Re[7]: Можно ли получить Bitmap из объекта Graphics ??
От: SlaVVVa Россия  
Дата: 19.04.07 12:44
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>Здравствуйте, SlaVVVa, Вы писали:



SVV>>нет это не подойдет,


_M_>подойдет. то как ты сделал это неправильно.


SVV>>у меня было что-то подобное — мерцание в этом случае происходит т.к. графикс панели уже залит белым а сетка и объекты еще не прорисовались.

SVV>>а теперь у меня делается по другоме — сначала рисуется новая картинка — потом она сразу помещается на панель, правда побочный эффект возникает — изменения на панели происходят с небольшой задержкой

_M_>эффект мерцания будет наблюдатся в том случае если ты рисуешь не из OnPaint.

_M_>Если ты рисуешь в OnPaint и проявляется мерцание, то достаточно включить свойство DoubleBuffered. В этом случае картинка рисуется не сразу на экране, а в памяти и лишь затем, когда ты уже все нарисовал выводится на экран.

_M_>Можно сделать по другому — создать Bitmap, рисовать в нем, а из OnPaint копировать битмап в Graphics.


все понял, спасибо, а то действительно как-то кривовато у меня это выглядело
Поймете смысл — найдутся слова.
Катон.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.