gpt4 book ai didi

delphi - 如何使 GraphicControl 变暗

转载 作者:行者123 更新时间:2023-12-03 18:13:57 28 4
gpt4 key购买 nike

我有一个 TCard(TGraphicControl 组件)并且它有一个属性背景(TP图片)

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

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

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

最佳答案

已启用处理

按照您的示例,TButton 的启用状态由 Windows 绘制。对于您自己的控件,应自行绘制禁用状态的视觉反射(reflect)。在覆盖的 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 因子(最大 255)表示临时位图与目标表面混合的程度。 Canvas 的默认颜色是 Parent 的颜色(假设你不干扰删除背景或其他东西),即上图中的 clBtnFace。如果该目的地全是白色,则位图将淡化为白色。如果您想要混合颜色或变暗的效果,请在 AlphaBlend 之前添加这两行:

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

screenshot 2

关于delphi - 如何使 GraphicControl 变暗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19785352/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com