2011-05-01 23 views
1

我有一个Direct2D演示,它创建一个GridPatternBitmapBrush,然后在绘制方法的TForm上绘制网格图案。如何让Direct2D GridPatternBitmapBrush出现在窗体的TcxImage.Canvas(DeveloperExpress TImage)insead上?如何在TcxImage Canvas上绘制Direct2D画布?

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; 
+0

如果我记得,TCxImage.Canvas是一个包装,其中包含一个“真实”的画布,像TCxImage.Canvas.Canvas一样....它可能就是这么简单。 – 2011-05-02 18:40:13

回答

0

您需要更改d2dCanvas的构造函数。

目前它的

d2dCanvas := TDirect2DCanvas.Create(Handle); 

这是经过处理的形式创建画布。

我没有德尔福2010(这似乎是随所需单位为演示),但我认为

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

应该做的伎俩

你需要通过画布。因为cx组件(至少是我的版本)使用包含TCanvas的TcxCanvas,因此Canvas对此构造器有效。

您可能能够将TcxImage控件的窗口句柄传递给Direct2DCanvas构造函数。

+0

通过使用您建议的构造函数,画布在cxImage中可见,但仅在调整窗体大小时才可见。调整窗体大小时,画布出现然后消失。当我释放鼠标按钮时,图像是空的,没有任何可见的东西。 任何想法? – Bill 2011-05-03 14:42:56

+0

如果您使用d2dCanvas:= TDirect2DCanvas.Create(cxImage1.Handle);作为构造函数Direct2DCanvas出现在cxImage中。在调整窗体大小时,TDirect2DCanvas保持可见。使用cxImage打开图像时,图像也会出现,但仅在调整窗体大小时才可见。 我希望能够使用TDirect2DCanvas做一个简单的图像绘画应用程序,但我不确定这是否可能。 – Bill 2011-05-03 15:23:45