Delphi TImage32 - 如果没有加载图片,如何使组件不可见?

时间:2017-09-08 14:47:35

标签: delphi transparent graphics32

如果您将表单或面板上的普通TImage组件放在其他组件之上>>它在运行时是不可见的,因为没有加载图片。所以其他事情是可见的。

TImage32默认情况下正在绘制一个灰色框。

如何在离开设置时使其不可见:.Visible:= True;如果没有加载图片? (我仍然需要处理组件的事件,比如OnClick ...)

是的,这是一个重复的问题,但是来自solution-linkprevious topic已经死了。 :(

2 个答案:

答案 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。

干杯, 即