Суббота, 20 Апреля 2024, 03:26

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Программирование .NET » Переопределение метода onPaint для устранения мерцания panel
Переопределение метода onPaint для устранения мерцания panel
AlkoshaДата: Суббота, 29 Августа 2015, 12:13 | Сообщение # 1
участник
Сейчас нет на сайте
Поясните, пожалуйста, поэтапно алгоритм действий.

В данный момент у меня в Form1.cs при маус-муве вызывается метод рисования:
Код

       public void redraw()  
         {

             using (Graphics g = this.panel1.CreateGraphics())
             {

             

                 Pen pen = new Pen(Color.Blue, 1);
                 Brush brush = new SolidBrush(Color.Violet);
                 g.Clear(Color.White);
                 for (int i = 0; i < mapheight; i++)
                 {
                     for (int j = 0; j < mapwidth; j++)
                     {
                         if (collis[i, j] != 0) g.FillRectangle(brush, i * 32, j * 32, 32, 32);
                         else
                             if (grid == true) g.DrawRectangle(pen, i * 32, j * 32, 32, 32);
                     }
                 }

                 if (imgbuff != null)
                 {
                     for (int i = 0; i < numtile; i++)  
                     {
                         g.DrawImage(naborpic [idxtile[i]], new Point(coordtileX[i]-(int)cumX, coordtileY[i]-(int)cumY));
                     }
                      
                         g.DrawImage(imgbuff, new Point(mX * 32, mY * 32), 0.5f);

                     pen = new Pen(Color.Red, 1);
                     int h = imgbuff.Size.Height;
                     int w = imgbuff.Size.Width;
                     g.DrawRectangle(pen, mX * 32, mY * 32, w, h);
                 }
                 pen.Dispose();
             }
         }


Жутко мерцает.

Порекомендовали переопределить метод onPaint.
Но я чего-то совсем не понимаю как это сделать.
Вот правой кнопкой мыши по проекту "добавить класс".
Содержимое которого.
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
     public class MyDrawPanel : UserControl
     {
         public MyDrawPanel()
         {
             SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
         }

         protected override void OnPaint(PaintEventArgs e)
         {
            
         }

         private void InitializeComponent()
         {
             this.SuspendLayout();
             //  
             // MyDrawPanel
             //  
             this.Name = "MyDrawPanel";
             this.Size = new System.Drawing.Size(800, 600);
             this.ResumeLayout(false);

         }
     }
}


А чего делать дальше ?
YellowAfterlifeДата: Суббота, 29 Августа 2015, 20:36 | Сообщение # 2
Сейчас нет на сайте
Для начала стоит попробовать поставить панели свойство DoubleBuffered [1]. Обычно это исправляет данный казус.

Если нет, в OnPaint нужно рисовать с передаваемый с свойстве PaintEventArgs' Graphics [2]. На приведенной странице есть пример.

1: https://msdn.microsoft.com/en-us....uffered
2: https://msdn.microsoft.com/en-us/library/7800848t

Ред.: похоже, форум не умеет в ссылки msdn в обычном виде.




Сообщение отредактировал YellowAfterlife - Суббота, 29 Августа 2015, 20:39
AlkoshaДата: Суббота, 29 Августа 2015, 23:47 | Сообщение # 3
участник
Сейчас нет на сайте
Цитата YellowAfterlife ()
Для начала стоит попробовать поставить панели свойство DoubleBuffered [1]


У панели этого свойства нет, вроде бы.

Цитата YellowAfterlife ()
Если нет, в OnPaint нужно рисовать с передаваемый с свойстве PaintEventArgs' Graphics [2]. На приведенной странице есть пример.


Ни панятна.

Как мне расположить пользовательский контрол (в данном случае MyDrawPanel ) на форме ?
YellowAfterlifeДата: Воскресенье, 30 Августа 2015, 10:37 | Сообщение # 4
Сейчас нет на сайте
Цитата Alkosha ()
У панели этого свойства нет, вроде бы.

Оно protected - нужно сделать некий DbPanel : Panel, в конструкторе которого свойство будет устанавливаться. Добавляется на форму путем добавления в список Controls (это не очень сложно найти)
Код
// ...
     private void Form1_Load(object sender, EventArgs e) {
         this.Controls.Add(new DbPanel());
     }
}
class DbPanel : Panel {
     public DbPanel() {
         DoubleBuffered = true;
     }
}




Сообщение отредактировал YellowAfterlife - Воскресенье, 30 Августа 2015, 10:38
AlkoshaДата: Среда, 02 Сентября 2015, 16:34 | Сообщение # 5
участник
Сейчас нет на сайте
Цитата YellowAfterlife ()
Оно protected - нужно сделать некий DbPanel : Panel, в конструкторе которого свойство будет устанавливаться. Добавляется на форму путем добавления в список Controls (это не очень сложно найти)
Код


Ща попробовал унаследовать панель с дабл-буфером.
Всё равно мерцает. Но теперь раза в два шустрее.

Для редактора уровней конечно не критично. Но это мерцание напрягает малость.

Добавлено (02 сентября 2015, 16:34)
---------------------------------------------
Когда много объектов на экране, жёстковато всё равно выглядит при обновлении.

Форум игроделов » Программирование » Программирование .NET » Переопределение метода onPaint для устранения мерцания panel
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг