我有一个TCard(TGraphicControl组件),它有一个属性背景(TPicture)
我希望能够使背景变暗或变暗.因此,如果我可以在游戏中玩牌那么正常.如果我不能在游戏中玩牌,那么它会变暗.我试过Tcard.enabled :=false像你按一下按钮,但它不会使它变暗或使图像/背景变暗.
我也找不到TPicture的alphablend属性,因为我认为这可能会有所帮助.
我需要什么属性或组件来获得这种效果?
按照您的示例,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)
