2016-12-22 40 views
1

次のTGPGraphicsのコンテンツをキャンバスにコピーしようとしていますが、動作しません。私はここで何が欠けていますか?あなたは、コンストラクタTGPGraphicsのコンテンツをキャンバスに描画する方法

TGPGraphics.Create(hdc: HDC) 

と直接キャンバスにTGPGraphicsを描くことができます

function DrawGlyph(bm: TObject; Canvas: TCanvas; X, Y: Integer): Integer; 
var 
    O: TGPBitmap; 
    G: TGPGraphics; 
begin 
    if (bm is TGPImage) then 
    begin 
    O := TGPBitmap.Create(16, 16, PixelFormat32bppARGB); 
    try 
     G := TGPGraphics.Create(O); 
     try 
     G.SetCompositingMode(CompositingModeSourceCopy); 
     G.SetInterpolationMode(InterpolationModeHighQualityBicubic); 
     G.SetPixelOffsetMode(PixelOffsetModeHighQuality); 
     G.SetSmoothingMode(SmoothingModeHighQuality); 
     G.DrawImage(TGPImage(bm), 0, 0, O.GetWidth, O.GetHeight); 

     BitBlt(Canvas.Handle, X, Y, O.GetWidth, O.GetHeight, G.GetHDC, 0, 0, SRCCOPY); 
     finally 
     G.Free; 
     end; 

    finally 
     O.Free; 
    end; 
    end; 
end; 
+1

あなたは中間TGPBitmapを使用したいのはなぜ? G:= TGPGraphics.Create(Canvas.Handle)に変更すると – EugeneK

+0

イメージをキャンバスに描画する前に16x16にサイズ変更したい –

+0

キャンバスに直接描画してもサイズが変更されます – EugeneK

答えて

2

またO: TGPBitmap例えば必要ありません。:

function DrawGlyph(bm: TObject; Canvas: TCanvas; X, Y: Integer): Integer; 
var 
    G: TGPGraphics; 
begin 
    // Result := ??? 
    if (bm is TGPImage) then 
    begin 
    Canvas.Lock; 
    try 
     G := TGPGraphics.Create(Canvas.Handle); 
     try 
     G.SetCompositingMode(CompositingModeSourceCopy); 
     G.SetInterpolationMode(InterpolationModeHighQualityBicubic); 
     G.SetPixelOffsetMode(PixelOffsetModeHighQuality); 
     G.SetSmoothingMode(SmoothingModeHighQuality); 
     G.DrawImage(TGPImage(bm), X, Y, 16, 16); 
     finally 
     G.Free; 
     end; 
    finally 
     Canvas.Unlock; 
    end; 
    end; 
end; 
関連する問題