我有一个TCard(TGraphicControl组件),它有一个属性 背景(TPicture)
我希望能够使背景变暗或变暗。因此,如果我可以在游戏中玩牌那么正常。如果我不能在游戏中玩牌,那么它会变暗。我试过放Tcard.enabled :=false
就像你按钮一样,但它不会使图像/背景变暗或变暗。
此外,我找不到TPicture的alphablend属性,因为我认为这可能会有所帮助。
我需要什么属性或组件来获得这种效果?
答案 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;
所有这一切都有以下结果:
SourceConstantAlpha
因子(max 255
)表示临时位图与目标曲面混合的程度。 Canvas的默认颜色是Parent的颜色(假设您不干扰擦除背景或其他内容),在上图中为clBtnFace
。如果该目标全部为白色,则位图将淡化为白色。如果您想要混合颜色或暗色效果,请在AlphaBlend之前添加这两行:
Canvas.Brush.Color := clBlack; //or clMaroon
Canvas.FillRect(ClientRect);