Odmalowywanie Panelu

0

Witam. Czytałem w sieci, że jak się chce coś malować to idealny jest PictureBox. Niestety jego metoda Refresh() jest potwornie wolna. Wolałbym skorzystać ze zwyczajnego Panelu, na którym maluje się błyskawicznie. Problem mam tylko, kiedy okno zasłoni jakieś inne okno, albo schowa się je poza ekran. Obraz zostaje zmazany.

Jak najszybciej odmalowywać brakujące fragmenty?
Czy powinienem wszystkie operacje malowania kopiować do Bitmapy a następnie przywracać w zdarzeniu Paint Panelu?
Czy da się to jakoś lepiej zrobić?

0

na pictureboxie działa także Invalidate() będzie imo szybciej

rysując w gdi+ wydajności super miał nie będziesz, ale aż tak tragicznie chyba nie jest.

I jeszcze tak Zastanawiam się czy te Csharpowe DrawImage nie będzie wolniejsze od BitBlit na przykład? Może warto potestować.

A może mały kurs DirectDraw-a zalicz.

0

dzięki, Invalidate trochę szybsze i można podać konkretny obszar do odmalowania, ale w moim przypadku jakoś wychodzi na to że bardziej opłaca się stworzyć dwa obiekty Graphics:

imageGraphics = Graphics.FromImage(image);
controlGraphics = Graphics.FromHwnd(parentControl.Handle);


i malować na nich jednocześnie:

<code class="c#">imageGraphics.DrawImage(bmp, p);
controlGraphics.DrawImage(bmp, p);

a w zdarzeniu parentControl.Paint odmalowywać z bitmapy:

controlGraphics.DrawImage(image, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel);


przewaga szybkości jest zauważalna.

...teraz tak się zastanawiam czy da się zrobić taki obiekt Graphics, który by malował jednocześnie to samo w dwóch innych? (tak żeby było mniej pisania kodu :D )

0

Oczywiście że się da, jak to się mówi – „normalnie”:

class DualGraphics
    {
        private Graphics graphics1;
        private Graphics graphics2;
        public DualGraphics(Graphics g1, Graphics g2)
        {
            graphics1 = g1;
            graphics2 = g2;
        }
        public void Clear(Color color)
        {
            graphics1.Clear(color);
            graphics2.Clear(color);
        }
        public void DrawEllipse(Pen pen, int x, int y, int width, int height)
        {
            graphics1.DrawEllipse(pen, x, y, width, height);
            graphics2.DrawEllipse(pen, x, y, width, height);
        }
        // i tak dalej wszystkie metody...
    }

Niestety, nie da się dziedziczyć po klasie Graphics. Trochę głupio.

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