Rysowanie po panelu, smużenie [C#]

0

Mam panel i obsługuję event rysowania w którym mam mniej więcej coś takiego:

private void paintEvent(object sender, PaintEventArgs e)
{
 e.Graphics.DrawImage(img, new Point(0, 0));
}

Czyli bardzo prosta rzecz. W innej metodzie ma edycję obrazka img ale robię to bardzo rzadko.
W tym momencie nawet nie zmieniając obrazka img, przy każdym repaincie czyli np rozciąganiu okna jest straszne smużenie. Jak to obejść. Przecież inne komponenty, buttony itp też są przy rozciąganiu przerysowane i jakoś nie migają.

0

Rozwiązanie jest niezwykle proste: podwójne buforowanie chłopcze.

0

Wydaje mi się że spełniam zasady double bufferingu. Img jest takim buforem. W evencie mam tylko rysowanie image na graphics. Nie wiem jak to prościej zrobić.

0

wlacz jeszcze double buffering dla okienka/kontrolki

1

Też się kiedyś męczyłem z rysowaniem na panelu.

Mimo wszystko polecam PictureBox który jakimś cudem jest szybszy i lepiej mu idzie doublebuffering.

0
massther napisał(a)

wlacz jeszcze double buffering dla okienka/kontrolki

To oczywiście próbowałem ale nic nie daje.

0

zrob override OnPaintBackground i nic w niej nie rob, tak zeby base.OnPaintBackground(e); sie nie odpalalo
jesli nie pomoze to jednak musisz podzielic sie kodem :)

0

Nie pomogło. Kodem dzielę się z chęcią bo ten kod, który jest tutaj istotny jest banalnie prosty:
Powtarzam że dla testów wstrzymałem wszelką edycję img. Więc jest tak:

private void paintEvent(object sender, PaintEventArgs e)
        {
            
                e.Graphics.DrawImage(img, new Point(0, 0));
            
        }

Wcześniej w konstruktorze mam: (paneli jest 7)

   for (int i = 0; i < linesCount; i++)
            {
                panels.Add(new System.Windows.Forms.Panel());
                panels[i].Location = new System.Drawing.Point(0, startY);
                startY += gapY;
                panels[i].Name = "panel" + i.ToString();
                panels[i].Size = new System.Drawing.Size(732, 70);
                panels[i].TabIndex = 5;
                panels[i].BorderStyle = BorderStyle.FixedSingle;
                historyPanel.Controls.Add(this.panels[i]);
                panels[i].Paint += new PaintEventHandler(paintEvent);
            }

Paneli jest 7 ale z jednym jest to samo.
Wszystko dzieje się w innej klasie niż forma, forma tworzy obiekt klasy rysującej przekazując między innymi wskaźnik na historyPanel który jest panelem na którym umieszczone są małe panelki :)

0

Jeszcze tylko detal nieistotny ale żeby nie było: panels to List<Panel>

0

dla każdego panelu musisz włączyć buforowanie

0

Nie wiem po jakiego wała, ale właściwość DoubleBuffered w klasie Panel jest protected. Przychodzi mi do głowy żeby utworzyć klasę dziedziczącą po Panel, tam ustawić buforowanie i obiekty tej klasy tworzyć, ale nie chce robić syfu w kodzie jeżeli to niekonieczne. Kto to projektował...

0

DoubleBuffered ustawiasz tak:

public static void SetDoubleBuffered(Control control)
{
  // set instance non-public property with name "DoubleBuffered" to true
  typeof(Control).InvokeMember("DoubleBuffered",
      BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
      null, control, new object[] { true });
}

Link:http://www.csharp-examples.net/set-doublebuffered/

0

Działa ;) dzięki
Nie znam się na reflections i nie mam pojęcia jak to działa ale działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1