如果您将表单或面板上的普通TImage组件放在其他组件之上>>它在运行时是不可见的,因为没有加载图片。所以其他事情是可见的。
但TImage32默认情况下正在绘制一个灰色框。
如何在离开设置时使其不可见:.Visible:= True;如果没有加载图片? (我仍然需要处理组件的事件,比如OnClick ...)
是的,这是一个重复的问题,但是来自solution-link的previous topic已经死了。 :(
答案 0 :(得分:1)
虽然我仍然可以访问新闻组帖子,但我不知道主题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实例的闪烁光标)
答案 1 :(得分:0)
我用一个图像来掩盖进度条并给它一个形状。
我所做的是加载一个png,其中包含透明的部分,然后将其放在我的进度条上。
我认为这应该达到你的目标。在你的图像中放置一个透明的png。
干杯, 即