如何调暗GraphicControl

时间:2013-11-05 09:17:05

标签: delphi delphi-xe2

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

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

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

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

1 个答案:

答案 0 :(得分:8)

处理已启用

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

if Enabled then
  // draw enabled
else
  // draw disabled;

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;

其中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;

所有这一切都有以下结果:

screenshot

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

  Canvas.Brush.Color := clBlack; //or clMaroon
  Canvas.FillRect(ClientRect);

screenshot 2

相关问题