如何调暗GraphicControl

Gle*_*rse 2 delphi delphi-xe2

我有一个TCard(TGraphicControl组件),它有一个属性背景(TPicture)

我希望能够使背景变暗或变暗.因此,如果我可以在游戏中玩牌那么正常.如果我不能在游戏中玩牌,那么它会变暗.我试过Tcard.enabled :=false像你按一下按钮,但它不会使它变暗或使图像/背景变暗.

我也找不到TPicture的alphablend属性,因为我认为这可能会有所帮助.

我需要什么属性或组件来获得这种效果?

NGL*_*GLN 8

处理已启用

按照您的示例,TButtonWindows 将启用启用状态.为了您自己的控制,您应该自己绘制一个残疾状态的视觉反映.在覆盖Paint例程中,这只是意味着:

if Enabled then
  // draw enabled
else
  // draw disabled;
Run Code Online (Sandbox Code Playgroud)

VCL负责处理Enabled属性的更改,因为它在CM_ENABLEDCHANGED消息上调用Invalidate .

绘图变暗了

最简单的解决方案是绘制所有必须绘制的alphablended:

procedure TCard.Paint;
var
  Tmp: TBitmap;
  BlendFunc: TBlendFunction;
begin
  if Enabled then
    InternalPaint(Canvas)
  else
  begin
    Tmp := TBitmap.Create;
    try
      Tmp.SetSize(Width, Height);
      InternalPaint(Tmp.Canvas);
      BlendFunc.BlendOp := AC_SRC_OVER;
      BlendFunc.BlendFlags := 0;
      BlendFunc.SourceConstantAlpha := 80;
      BlendFunc.AlphaFormat := 0;
      WinApi.Windows.AlphaBlend(Canvas.Handle, 0, 0, Width, Height,
        Tmp.Canvas.Handle, 0, 0, Width, Height, BlendFunc);
    finally
      Tmp.Free;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

其中InternalPaint例程执行您现在正在执行的所有操作,例如:

procedure TCard.InternalPaint(ACanvas: TCanvas);
var
  R: TRect;
begin
  R := ClientRect;
  ACanvas.Brush.Color := clGray;
  ACanvas.Rectangle(R);
  InflateRect(R, -7, -7);
  if (FPicture.Graphic <> nil) and (not FPicture.Graphic.Empty) then
    ACanvas.StretchDraw(R, FPicture.Graphic);
end;
Run Code Online (Sandbox Code Playgroud)

所有这些都有以下结果:

截图

SourceConstantAlpha因子(最大255)由多少暂时位图与目标表面混合表示.Canvas的默认颜色是Parent的颜色(假设您不干扰擦除背景或其他内容),clBtnFace如上图所示.如果该目标全部为白色,则位图将淡化为白色.如果您想要混合颜色或暗色效果,请在AlphaBlend之前添加这两行:

  Canvas.Brush.Color := clBlack; //or clMaroon
  Canvas.FillRect(ClientRect);
Run Code Online (Sandbox Code Playgroud)

截图2