Как нарисовать холст Direct2D на холсте TcxImage?

У меня есть демонстрация Direct2D, которая создает GridPatternBitmapBrush, а затем рисует сетку на TForm в методе рисования. Как получить Direct2D GridPatternBitmapBrush для появления в виде TcxImage.Canvas( DeveloperExpress TImage) формы?

procedure TFormAdvGeometries.Create_FRadialGradientBrush;
var
//  aGradientStops: array of TD2D1GradientStop;
//  aGradBrushProps: TD2D1RadialGradientBrushProperties;
//  aGradStopsCollection: ID2D1GradientStopCollection;

  gradColors: array of TColor;
begin
  SetLength(gradColors, 3);
  gradColors[0] := TColor($00D7FF); // Gold (D2D1Helper.h)
  gradColors[1] := TColor($00A5FF); // Orange (D2D1Helper.h)
  gradColors[2] := TColor($0045FF); // OrangeRed (D2D1Helper.h)


  // this is a place-holder.
  // Code below assumes equal spread for positions in gradient stops
  FRadialGradientBrush := d2dCanvas.CreateBrush(
    gradColors,
    D2D1PointF(330, 330),
    D2D1PointF(140, 140),
    140,
    140
    );
end;

procedure TFormAdvGeometries.Create_FGridPatternBitmapBrush;
var
  gridBrush: ID2D1SolidColorBrush;
  bmpBrushProps: D2D1_BITMAP_BRUSH_PROPERTIES;
  bitmapRenderTarget: ID2D1BitmapRenderTarget;
  bmpSize: D2D_SIZE_F;
  gridBitmap: ID2D1Bitmap;
begin
  bmpSize.width := 10;
  bmpSize.height := 10;
  d2dCanvas.RenderTarget.CreateCompatibleRenderTarget(
    @bmpSize, nil, nil, 0, bitmapRenderTarget);
  bitmapRenderTarget.CreateSolidColorBrush(
    D2D1ColorF(0.93, 0.94, 0.96, 1), nil, gridBrush);
  bitmapRenderTarget.BeginDraw;
  bitmapRenderTarget.FillRectangle(Rect(0, 0, 10, 1), gridBrush);
  bitmapRenderTarget.FillRectangle(Rect(0, 0, 1, 10), gridBrush);
  bitmapRenderTarget.EndDraw;
  bitmapRenderTarget.GetBitmap(gridBitmap);
  bmpBrushProps.extendModeX := D2D1_EXTEND_MODE_WRAP;
  bmpBrushProps.extendModeY := D2D1_EXTEND_MODE_WRAP;
  bmpBrushProps.interpolationMode := 0; // could be 1
  d2dCanvas.RenderTarget.CreateBitmapBrush(
    gridBitmap, @bmpBrushProps, nil, FGridPatternBitmapBrush);
end;

procedure TFormAdvGeometries.CreateDeviceResources;
begin
  Create_FRadialGradientBrush;
  Create_FGridPatternBitmapBrush;
end;

procedure TFormAdvGeometries.Paint;
var defMatrix: TD2DMatrix3x2F;
begin
  inherited;

  CreateDeviceResources;

  d2dCanvas.BeginDraw;
  try
    d2dCanvas.RenderTarget.GetTransform (defMatrix);

    // fill with white color the whole window
    d2dCanvas.RenderTarget.Clear(D2D1ColorF(clWhite));

    // fill canvas with little blue rectangles
    d2dCanvas.Brush.Handle := FGridPatternBitmapBrush;
    d2dCanvas.Rectangle(0, 0, ClientWidth + 50, ClientHeight + 50);

    // reset standard transformation
    d2dCanvas.RenderTarget.SetTransform (defMatrix);
  finally
    d2dCanvas.EndDraw;
  end;
end;

1 ответ

Вам нужно изменить конструктор d2dCanvas.

В настоящее время это

  d2dCanvas := TDirect2DCanvas.Create(Handle);

который передает дескриптор формы, чтобы создать холст.

У меня нет Delphi 2010 (который, кажется, поставляется с необходимыми единицами для демонстрации), но я думаю,

  d2dCanvas := TDirect2DCanvas.Create(MyTcxImage.Canvas.Canvas, Rect(0,0, MyTcxImage.Width,MyTcxImage.Height));

должен сделать трюк

Вам нужно передать Canvas.Canvas этому конструктору, потому что компоненты cx (по крайней мере, моя версия) используют TcxCanvas, который содержит TCanvas.

Возможно, вы сможете передать дескриптор окна элемента управления TcxImage конструктору Direct2DCanvas.

Другие вопросы по тегам