- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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;
所有这些结果如下:
SourceConstantAlpha
因子(最大 255
)表示临时位图与目标表面混合的程度。 Canvas 的默认颜色是 Parent 的颜色(假设你不干扰删除背景或其他东西),即上图中的 clBtnFace
。如果该目的地全是白色,则位图将淡化为白色。如果您想要混合颜色或变暗的效果,请在 AlphaBlend 之前添加这两行:
Canvas.Brush.Color := clBlack; //or clMaroon
Canvas.FillRect(ClientRect);
关于delphi - 如何使 GraphicControl 变暗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19785352/
我有一个 TCard(TGraphicControl 组件)并且它有一个属性背景(TP图片) 我希望能够使背景变暗或变暗。因此,如果我可以在游戏中玩卡片,那么它是正常的。如果我不能在游戏中玩这张卡,那
我是一名优秀的程序员,十分优秀!