如果您将普通的 TImage 组件放置在表单或面板上的其他组件上>>只要没有加载图片,它在运行时是不可见的。所以它下面的其他东西是可见的。
但是TImage32默认画的是一个灰色的盒子。
如何在离开设置时使其不可见:.Visible:=True; 如果没有加载图片?
(我仍然需要在组件上工作的事件,比如 OnClick ......)
如果您将普通的 TImage 组件放置在表单或面板上的其他组件上>>只要没有加载图片,它在运行时是不可见的。所以它下面的其他东西是可见的。
但是TImage32默认画的是一个灰色的盒子。
如何在离开设置时使其不可见:.Visible:=True; 如果没有加载图片?
(我仍然需要在组件上工作的事件,比如 OnClick ......)
虽然我仍然可以访问新闻组帖子,但我不知道主题 ID 与主题标题的关系(这就是我所拥有的)。然而,基于在新闻组中的搜索,我发现了几个提到 TImage32Ex 的地方。我猜这个组件(它不是核心库的一部分)在某种程度上是解决方案的一部分。
因此,虽然不再维护该组件所来自的扩展包,但让我们更深入地了解它的作用。
首先,我必须说 TImage32 将始终将其缓冲区的内容绘制(复制)到显示器。这意味着默认情况下,该组件后面的任何图形都将被覆盖。
TImage32Ex 的技巧是获取父内容并将其绘制到缓冲区中。
通过改编,代码看起来像这样
var
P: TPoint;
SaveIndex: Integer;
begin
SaveIndex := SaveDC(Buffer.Handle);
try
GetViewportOrgEx(Buffer.Handle, P);
SetViewportOrgEx(Buffer.Handle, P.X - Left, P.Y - Top, nil);
IntersectClipRect(Buffer.Handle, 0, 0, Parent.ClientWidth, Parent.ClientHeight);
Parent.Perform(WM_ERASEBKGND, Buffer.Handle, 0);
Parent.Perform(WM_PAINT, Buffer.Handle, 0);
finally
RestoreDC(Buffer.Handle, SaveIndex);
end;
end;
上面的代码将 (WM_PAINT) 父级的内容绘制到缓冲区上。
例如,如果您想让名为 PaintBox32 的 TPaintBox32 实例透明,只需将以下代码添加到“PaintBuffer”处理程序:
procedure TForm3.PaintBox32PaintBuffer(Sender: TObject);
var
P: TPoint;
SaveIndex: Integer;
begin
SaveIndex := SaveDC(PaintBox32.Buffer.Handle);
try
GetViewportOrgEx(PaintBox32.Buffer.Handle, P);
SetViewportOrgEx(PaintBox32.Buffer.Handle, P.X - PaintBox32.Left, P.Y - PaintBox32.Top, nil);
IntersectClipRect(PaintBox32.Buffer.Handle, 0, 0, PaintBox32.Parent.ClientWidth, PaintBox32.Parent.ClientHeight);
PaintBox32.Parent.Perform(WM_ERASEBKGND, PaintBox32.Buffer.Handle, 0);
PaintBox32.Parent.Perform(WM_PAINT, PaintBox32.Buffer.Handle, 0);
finally
RestoreDC(PaintBox32.Buffer.Handle, SaveIndex);
end;
end;
注意:虽然这基本有效,但它可能无法正确捕获父级的子控件。对于 TWinControl 后代尤其如此。虽然也有解决方案来涵盖这种情况,但在每个细节上都涵盖这一点要复杂得多(例如,底层 TEdit 实例的闪烁光标)
我使用 timage 来掩盖进度条并赋予其形状。
我所做的是加载一个带有透明部分的 png,然后将它放在我的进度条上。
我认为这应该可以实现您的目标。在您的 timage 中放置一个透明的 png。
干杯,E。