¿Cómo combinar el color (colorear según el valor alfa especificado) del área del lienzo utilizando GDI puro?

Me gustaría combinar el color (colorear con un valor alfa especificado) el área de un lienzo usando pureWindows GDI (por lo tanto, sin GDI +, DirectX o similar, sin OpenGL, sin ensamblador o bibliotecas de terceros).

He creado la siguiente función y me gustaría saber si hay una forma más eficiente o sencilla de hacerlo:

<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>

Para saber qué debe hacer esta función, vea las siguientes imágenes (discriminatorias :-):

Y el código que puede hacer.this image en la parte superior izquierda del formulario de la forma que se muestra arriba:

<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>

¿Hay una manera más eficiente de hacerlo usando GDI puro o Delphi VCL?

Respuestas a la pregunta(1)

Su respuesta a la pregunta