如何解决如何将Direct2D画布绘制到TcxImage画布上?
| 我有一个Direct2D演示,该演示创建GridPatternBitmapBrush,然后以Paint方法在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,bitmaprendertarget);
bitmaprendertarget.CreateSolidColorBrush(
D2D1ColorF(0.93,0.94,0.96,1),gridBrush);
bitmaprendertarget.BeginDraw;
bitmaprendertarget.FillRectangle(Rect(0,10,gridBrush);
bitmaprendertarget.FillRectangle(Rect(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,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,ClientWidth + 50,ClientHeight + 50);
// reset standard transformation
d2dCanvas.rendertarget.SetTransform (defMatrix);
finally
d2dCanvas.EndDraw;
end;
end;
解决方法
您需要更改d2dCanvas的构造函数。
目前是
d2dCanvas := TDirect2DCanvas.Create(Handle);
它传递表单句柄以创建画布。
我没有Delphi 2010(似乎随附了演示所需的单元),但我认为
d2dCanvas := TDirect2DCanvas.Create(MyTcxImage.Canvas.Canvas,Rect(0,MyTcxImage.Width,MyTcxImage.Height));
应该做到的
您需要将Canvas.Canvas传递给此构造函数,因为cx组件(至少是我的版本)使用了包含TCanvas的TcxCanvas。
您可能可以将TcxImage控件的窗口句柄传递给Direct2DCanvas构造函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。