GDI + рисование на TBitmap - PullRequest
       75

GDI + рисование на TBitmap

1 голос
/ 20 октября 2019

В дополнение к рисованию GDI + на холсте управления с помощью TGPGraphics (который работал нормально), я также пытаюсь нарисовать на TBitmap с использованием GDI +, а затем отрисовать это растровое изображение на холсте управления,Тем не менее, на самом деле ничто не отображается.

Следующий код находится в обработчике сообщений WM_PAINT, который снова работает для фактического холста элемента управления, но при создании эквивалентного объекта TGPGraphics и передаче этого TBitmap дескриптор, ничто не рисуется:

  FBitmapCanvas:= CreateGPCanvas(FBitmap.Handle);
  try
    FBitmapCanvas.DrawLine(FSomePen, P1, P2); //Same pen used to successfully draw to control canvas
  finally
    FreeAndNil(FBitmapCanvas);
  end;
  Canvas.Draw(0, 0, FBitmap); //Draw this bitmap to control canvas

CreateGPCanvas выглядит так, и используется как для этого растрового изображения, так и для элемента управления:

function CreateGPCanvas(const DC: HDC): TGPGraphics;
begin
  Result:= TGPGraphics.Create(DC);
  Result.SetInterpolationMode(InterpolationMode.InterpolationModeHighQuality);
  Result.SetSmoothingMode(SmoothingMode.SmoothingModeHighQuality);
  Result.SetCompositingQuality(CompositingQuality.CompositingQualityHighQuality);
end;

С другой стороны, если я неПопытка использовать TGPGraphics и вместо этого нарисовать линию непосредственно через свойство TBitmap.Canvas, работает нормально (но, конечно, выглядит некрасиво, потому что это не GDI +). Итак, я знаю, что фактическое растровое изображение корректно отображается на холсте элемента управления.

FBitmap.Canvas.MoveTo(P1.X, P1.Y);
FBitmap.Canvas.LineTo(P2.X, P2.Y);

Что я здесь не так делаю и как заставить TGPGraphics работать на этом растровом холсте?


PS - Единственная причина, по которой я вообще использую TBitmap, заключается в том, что то, что я на самом деле пишу, должно «запомнить» часть того, что было нарисовано ранее, и сохранить ее, а не перекрашивать снова и снова.

1 Ответ

3 голосов
/ 20 октября 2019

Просто выяснил проблему, и это была глупая ошибка.

При создании объекта TGPGraphics вместо передачи FBitmap.Handle это скорее должно быть FBitmap.Canvas.Handle.

Вам нужен дескриптор холста растрового изображения, а не самого растрового изображения.

...