2011-05-01 26 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