使用AlphaBlend时如何定义颜色?

Cra*_*aig 2 delphi lazarus

我有一个绘制在绘图箱上的图像,我希望能够在绘图框的任何给定区域上方显示一个半透明的填充矩形,它将以更深的颜色显示底部的绘图板画布,有点像Windows资源管理器中的选择框.

经过多次试验和错误(以及一些阅读),我设法做了以下事情:

procedure OpacityRectangle(ACanvas: TCanvas; ARect: TRect; AColor: TColor;
  AOpacity: Integer);
var
  BlendFunc: BLENDFUNCTION;
  W, H: Integer;
  Bitmap: TBitmap;
begin
  W := ARect.Width;
  H := ARect.Height;

  BlendFunc.BlendOp := AC_SRC_OVER;
  BlendFunc.BlendFlags := 0;
  BlendFunc.SourceConstantAlpha := AOpacity;
  BlendFunc.AlphaFormat := 0;

  Bitmap := TBitmap.Create;
  try
    Bitmap.PixelFormat := pf32Bit;
    Bitmap.SetSize(W, H);    
    BitBlt(Bitmap.Canvas.Handle, ARect.Left + W, ARect.Top + H, W, H,
      ACanvas.Handle, 0, 0, SRCCOPY);
    AlphaBlend(ACanvas.Handle, ARect.Left, ARect.Top,
        W, H, Bitmap.Canvas.Handle, 0, 0, W, H, BlendFunc);
  finally
    Bitmap.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,AColor参数未被使用,因为我不确定如何在上面实现它.目前alpha混合矩形的颜色是灰色阴影(我假设默认颜色),我需要知道如何更改alpha混合矩形的色调颜色.

如何修改上述内容以允许为着色的alpha混合矩形选择自定义颜色?

Ser*_*yuz 8

目前你使用白色,你认为它是灰色的原因是半透明.您可以通过将255作为"AOpacity"传递来验证它,您将看到一个白色矩形.

色调颜色为白色,因为这是临时位图的颜色.您需要做的就是使用彩色位图.您应该删除该BitBlt调用,纯色位图足以在将其透明地复制到目标画布时应用有色颜色.

  ...
  try
    Bitmap.PixelFormat := pf32Bit;
    Bitmap.Canvas.Brush.Color := AColor;  // <- set tint color
    Bitmap.SetSize(W, H);
    AlphaBlend(ACanvas.Handle, ARect.Left, ARect.Top,
      ...
Run Code Online (Sandbox Code Playgroud)


在Lazarus的情况下,明确地绘制位图表面,fpc图形在放大位图时不支持画笔颜色(因此位图最初是黑色的).

  ..
  try
    Bitmap.PixelFormat := pf32Bit;
    Bitmap.SetSize(W, H);
    Bitmap.Canvas.Brush.Color := AColor;
    Bitmap.Canvas.FillRect(Bitmap.Canvas.ClipRect);
    AlphaBlend(ACanvas.Handle, ARect.Left, ARect.Top,
      ...
Run Code Online (Sandbox Code Playgroud)