【问题标题】:How to dim out a GraphicControl如何使 GraphicControl 变暗
【发布时间】:2013-11-05 09:17:04
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你可以画到屏幕外的位图,然后转换成灰度,然后blit到画布上。
  • 在表格上,如果 TCard 可以“播放”,那么它的正常颜色如果不能“播放”,那么我希望它变暗.. 我找不到任何方法来调整 alphablend一张图片。由于背景是自定义组件 TCard(tgraphicControl) 中的 TPicture。我猜这是我的最终目标。也许我应该改写这个问题?但是你所说的这种选择效果..这会让我按照我的要求去做吗?
  • alpha 混合将如何帮助您?或者您想让您的卡片半透明以表示已禁用?你能解释一下你为什么谈论TGraphicControlTPicture吗?是哪个?
  • @GlenMorse 请记住,我们可以获得的所有信息都是问题中出现的信息。 Alpha 混合可以做很多事情,但它通常与透明效果一起使用。这就是 Alpha 通道的意义所在。你真正想要达到什么效果?
  • 看这张图,有些卡是暗的,有些卡是正常的。我正在尝试这个效果garethfouche.com/wp-content/uploads/2011/12/…

标签: delphi delphi-xe2


【解决方案1】:

启用处理

按照您的示例,TButton 的启用状态由 Windows 绘制。对于您自己的控件,应自己绘制禁用状态的视觉反映。在被覆盖的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;

结果如下:

SourceConstantAlpha 因子(最大 255)表示临时位图与目标表面的混合程度。 Canvas 的默认颜色是 Parent 的颜色(假设你不干扰擦除背景什么的),也就是上图中的clBtnFace。如果该目的地全为白色,则位图将淡化为白色。如果您想要混合颜色或变暗效果,请在 AlphaBlend 之前添加以下两行:

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

【讨论】:

  • 很好的答案,迫不及待想尝试一下。顺便说一句,图片是什么?
  • 使用WinAPI需要包含哪些内容?
  • WinApi.Windows 因为你有 XE2。但你不必有资格;这是我使用代码完成的残余:Windows.AlphaBlend 或只是AlphaBlend 可能会工作得很好。
猜你喜欢
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
相关资源
最近更新 更多