Как нарисовать Direct2D canvas на TCCXIMAGE Canvas?

#delphi #devexpress #direct2d

#delphi #devexpress #direct2d

Вопрос:

У меня есть демонстрационная версия Direct2D, которая создает GridPatternBitmapBrush, а затем рисует шаблон сетки на TForm методом paint. Как заставить Direct2D GridPatternBitmapBrush отображаться на tccximage.Холст (время разработки) вместо формы?

 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. Если я помню, tccximage. Canvas — это оболочка, содержащая внутри «настоящий» холст, что-то вроде TCxImage. Холст. Холст…. это может быть так просто.

Ответ №1:

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

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

   d2dCanvas := TDirect2DCanvas.Create(Handle);
  

который передает дескриптор forms для создания холста.

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

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

должно сработать

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

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

Комментарии:

1. С помощью предложенного вами конструктора холст виден в CxImage, но только при изменении размера формы. При изменении размера формы холст появляется, а затем исчезает. Когда я отпускаю кнопку мыши, изображение пустое, ничего не видно. Есть идеи?

2. Если вы используете d2dCanvas := TDirect2DCanvas. Создать(csImage1. Дескриптор); в качестве конструктора Direct2DCanvas отображается в CxImage. При изменении размера формы TDirect2DCanvas остается видимым. Когда вы открываете изображение с помощью CxImage, изображение также появляется, но оно видно только при изменении размера формы. Я надеялся, что смогу создать простое приложение для рисования изображений, используя TDirect2DCanvas, но я не уверен, возможно ли это.