Gdiplus DrawImage "медленный" рендер - PullRequest
0 голосов
/ 09 ноября 2018

Я использую C ++ Builder с PaintBox в качестве «видимого» графического объекта. У меня есть функция для рисования прямоугольника выбора (вызывается из события onMouseMove). Для двойной буферизации я использую Gdiplus :: Bitmap. Для рендеринга завершенного кадра я создаю экземпляр Gdiplus :: Graphics с помощью PaintBox HDC, а затем рисую растровое изображение на нем с помощью функции DrawImage.

 void TMainForm::DrawSelectingRect(int StartX, int StartY, int EndX, int EndY, Gdiplus::Bitmap *CachedBitmap,
                Gdiplus::Bitmap *DestBitmap)
        {  
            Gdiplus::Graphics DestGraphics(DestBitmap);

            DestGraphics.DrawImage(CachedBitmap, 0, 0);

            Gdiplus::Pen Pen(Gdiplus::Color::Silver, 1);
            Gdiplus::SolidBrush Brush(Gdiplus::Color::MakeARGB(100, 150, 150, 150));

            DestGraphics.FillRectangle(&Brush, (StartX<EndX)*StartX + (EndX<=StartX)*EndX,
            (StartY<EndY)*StartY + (EndY<=StartY)*EndY,
            abs(EndX - StartX),
            abs(EndY - StartY));

            DestGraphics.DrawRectangle(&Pen, (StartX<EndX)*StartX + (EndX<=StartX)*EndX,
            (StartY<EndY)*StartY + (EndY<=StartY)*EndY,
            abs(EndX - StartX),
            abs(EndY - StartY));


            Gdiplus::Graphics PaintBoxGraphics(MainForm->PaintBox->Canvas->Handle);
            PaintBoxGraphics.DrawImage(DestBitmap, 0, 0);
            DestGraphics.Flush(Gdiplus::FlushIntentionFlush);
            PaintBoxGraphics.Flush(Gdiplus::FlushIntentionFlush);
        }

Проблема в том, что реализация DrawImage, по-видимому, не предполагает плавного «копирования» * изображения (видно, как отображается кадр), в отличие от стандартной функции VCL TCanvas Draw (). Так что я исправляю это, создав экземпляр VCL TBitmap и используя его холст во всех функциях Gdiplus и в конце рисуя его в PaintBox-> Canvas. Кажется очевидным, что это крайне неэффективный способ справиться с этим - есть ли другой способ исправить это?

...