4

出于某种原因,表单上的透明控件在某些计算机上变得不透明。我在“Acer Netbook”和“Thinkpad x600”上收到了有关它的报告。该应用程序是使用 Delphi 2007 构建的。

这是它的样子: 链接

虽然它应该看起来像这样: 链接

窗体上的不透明控件是 TLabels 和 TStaticTexts。

(我使用 TStaticText 控件来定义可点击区域,因为无句柄控件(如标签)的鼠标消息转到 WM_NCHITTEST 处理程序。底部的“按钮”是黑色的,因为我不小心将其颜色设置为 clNone,尽管它不应该完全可见。)

为什么会发生这种情况以及如何防止这种情况(除了将文本渲染到背景图像等变通方法)?

编辑:我设法在我的笔记本电脑上重现了这个问题,它运行的是 32 位颜色的 Windows XP,并使用经过认证的 ATI 驱动程序。

4

5 回答 5

10

TLabel 和表单之间有 TImage 吗?如果是这种情况,则将表单的颜色设置为黑色。当您将 TLabel 设置为透明时,它会将其绘制在其父级上,并且 TImage 不能有子控件。实际上,它是将表单的颜色渲染到标签上,因为表单是父表单。

另外两种可能的解决方法包括将图像直接绘制到表单上(不使用 TLabel),但我不知道这是否可行。另一种方法是创建您自己的图像控件,该控件源自 TWinControl(而不是 TGraphicControl)并且可以包含子控件。YMMV 关于这些解决方案。

我怀疑它在某些机器上不起作用的原因是底层的 Windows API 库不同。

于 2009-04-17T18:41:51.590 回答
3

这与系统本身的品牌无关。按照可能性的顺序,检查这些(假设您正在谈论 Windows 系统):

  • 透明度要求显示位深度为 32。如果显示设置为 16 位颜色,则无法绘制透明控件。用户可修复,您不应自动切换模式。

  • 视频驱动程序问题 - 确保用户拥有制造商推荐的视频驱动程序。如果这些都失败了,请尝试最新的。

  • 透明度(实际上是 alpha 混合)仅在 Windows 2000 或更高版本上受支持 - 您确定它们没有运行旧版本吗?

如果您从用户那里获得更多数据(或者如果您有这些数据,请发布它),这将很有帮助。因为您甚至没有提及使用的操作系统,所以我们在这里盲目拍摄。

于 2009-04-17T15:34:46.440 回答
2

如果上面有TFormwithTImageTLabel- 透明度存在问题,有时即使TLabel.Transparent属性显示为,标签也不透明True

我已经使用 VMWare 和 Windows XP / Windows 7 重现了这个问题。为了实现它,我必须启用“Windows Classic”主题。Windows 7 具有 Windows Aero 主题、Windows Basic 和 Windows Classic 主题。仅当启用“Windows 经典”主题时才会出现问题。(Windows XP 也有这个主题)。

TLabel已经有Transparent属性,它是True默认的。并且标签是透明的,除非启用“Windows 经典”主题。当您在表单上放置新标签时 - 它的Transparent属性显示为True,但在 Object Inspector中未显示为粗体。要解决透明度问题,您只需切换标签的Transparent属性:首先将其设置为False,然后再设置为True. 这将使标签的Transparent属性显示为True,但值将是粗体。或者只是编辑.dfm文件并添加Transparent = True到所有需要透明度的标签。

这个问题对于 Delphi 10.2 Tokyo 是实际的。

于 2017-06-29T03:50:43.280 回答
0

虽然不是一个完美的解决方案,但在处理透明度问题方面会更好,那就是根本不使用透明度,将标签背景颜色设置为与背景颜色匹配,然后使用与边距属性对齐并设置边距以定位表格上的标签。对于下一个,关闭和最小化按钮,我会制作这些单独的图形以避免任何字体或 DPI 问题。

于 2009-04-17T20:37:03.933 回答
0

我遇到了这个问题,这让我发疯了。

我的应用程序使用 TLabels 而不是 TButtons。在运行时,我创建 TShapes,大小适合标签。我设置了 OnMouseEnter 和 OnMouseLeave 事件来更改 TShape 的颜色。它在我测试的每台机器上都运行良好,直到我安装了一个遇到 OP 问题的特定 XP 安装。

我终于找到了一个有效的解决方案。

  for i := 0 to frm.ComponentCount-1 do begin
  if (frm.Components[i] is TLabel) and
     (((TLabel(frm.Components[i]).Tag > 999) and
     (Length(TLabel(frm.Components[i]).Caption) > 1) and (Assigned(TLabel(frm.Components[i]).OnClick))) or
     (TLabel(frm.Components[i]).Caption = 'Close')) then
    begin
      //setting this to false here, then to true at the bottom eliminates the "opaquing" problem
      TLabel(frm.Components[i]).Transparent := False;

      ls := TShape.Create(frm);
      ls.Name := 'ClickLabel' + IntToStr(i) + TWinControl(frm.Components[i]).Name;
      ls.Parent := TWinControl(frm.Components[i]).Parent;
      ls.Hint := TWinControl(frm.Components[i]).Hint;
      ls.ShowHint := True;
      ls.Top := TWinControl(frm.Components[i]).Top-4;
      ls.Left := TWinControl(frm.Components[i]).Left-7;
      ls.Width := TWinControl(frm.Components[i]).Width + 12;
      ls.Height := TWinControl(frm.Components[i]).Height + 8;
      ls.Shape := stRoundRect;   
      ls.BringToFront;
      TWinControl(frm.Components[i]).BringToFront;
      ls.Visible := TWinControl(frm.Components[i]).Visible;
      ls.Tag := TWinControl(frm.Components[i]).Tag;

      ls.OnMouseEnter := EvHandler.lblNavMouseEnter;
      ls.OnMouseLeave := EvHandler.lblNavMouseLeave;
      ls.Anchors := TLabel(frm.Components[i]).Anchors;

      ls.Pen.Width := 2;

      TLabel(frm.Components[i]).Transparent := True;
    end;
end;
于 2014-08-21T15:32:38.723 回答