Jak pokolorować połączenie (ubarwienie według określonej wartości alfa) obszaru płótna przy użyciu czystego interfejsu GDI?

Chciałbym pokolorować połączenie (kolorowanie według określonej wartości alfa) obszaru płótna, używając czystegoWindows GDI (więc bez GDI +, DirectX lub podobnych, bez OpenGL, bez asemblera lub bibliotek innych firm).

Stworzyłem następującą funkcję i chciałbym wiedzieć, czy jest to bardziej wydajny lub łatwiejszy sposób:

<code>procedure ColorBlend(const ACanvas: HDC; const ARect: TRect;
  const ABlendColor: TColor; const ABlendValue: Integer);
var
  DC: HDC;
  Brush: HBRUSH;
  Bitmap: HBITMAP;
  BlendFunction: TBlendFunction;
begin
  DC := CreateCompatibleDC(ACanvas);
  Bitmap := CreateCompatibleBitmap(ACanvas, ARect.Right - ARect.Left,
    ARect.Bottom - ARect.Top);
  Brush := CreateSolidBrush(ColorToRGB(ABlendColor));
  try
    SelectObject(DC, Bitmap);
    Windows.FillRect(DC, Rect(0, 0, ARect.Right - ARect.Left,
      ARect.Bottom - ARect.Top), Brush);
    BlendFunction.BlendOp := AC_SRC_OVER;
    BlendFunction.BlendFlags := 0;
    BlendFunction.AlphaFormat := 0;
    BlendFunction.SourceConstantAlpha := ABlendValue;
    Windows.AlphaBlend(ACanvas, ARect.Left, ARect.Top,
      ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, DC, 0, 0,
      ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, BlendFunction);
  finally
    DeleteObject(Brush);
    DeleteObject(Bitmap);
    DeleteDC(DC);
  end;
end;
</code>

Aby zobaczyć, co ta funkcja powinna zrobić, zobacz następujące (rozróżniające :-) obrazy:

I kod, który może renderowaćthis image w lewym górnym rogu formularza w sposób pokazany powyżej:

<code>uses
  PNGImage;

procedure TForm1.Button1Click(Sender: TObject);
var
  Image: TPNGImage;
begin
  Image := TPNGImage.Create;
  try
    Image.LoadFromFile('d:\6G3Eg.png');
    ColorBlend(Image.Canvas.Handle, Image.Canvas.ClipRect, $0000FF80, 175);
    Canvas.Draw(0, 0, Image);
  finally
    Image.Free;
  end;
end;
</code>

Czy jest bardziej wydajny sposób na wykonanie tego przy użyciu czystego GDI lub Delphi VCL?

questionAnswers(1)

yourAnswerToTheQuestion