#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, но я не уверен, возможно ли это.