如何在半透明窗口上显示不透明文本?

时间:2013-12-03 15:19:22

标签: delphi window transparent

你能告诉我为此目的所需的功能名称吗?我正在使用Delphi XE 5.我想得到这个效果:

http://i.stack.imgur.com/OXjoc.jpg

窗口:半透明

字体:完全可见。

我将使用“系统”字体(AA的零问题)

我在MSDN上看到什么?我需要使用哪些功能(名称)?

3 个答案:

答案 0 :(得分:4)

这与Marcus的回答基本相同,但有一些改进。您可能需要根据需要进行调整,但原则如下:

使用以下属性创建form1:

AlphaBlend := True;
AlphaBlendValue := 128;
BorderStyle := bsNone;

根据需要使用控件创建form2,并使用以下属性:

Color := clFuchsia; // or whatever color is not used
TransparentColor := true;
TransparentColorValue := Color;

在form1中声明一个名为AllowMove的布尔字段。

在TForm1.FormShow中调用以下代码:

begin
  form2.BorderStyle := bsNone;
  form2.SetBounds(0, 0, ClientWidth, ClientHeight);
  form2.Show;
  AllowMove := true;
end;

在form1中声明一个名为AllowMove的布尔字段和一个WM_MOVE的消息处理程序:

procedure WMMOVE(var Message: TMessage); message WM_MOVE;

procedure TForm1.WMMOVE(var Message: TMessage);
begin
  inherited;
  if AllowMove then begin
    Form2.Left := Message.LParamLo;
    Form2.Top := Message.LParamHi;
  end;
  Message.Result := 0;
end;

答案 1 :(得分:2)

我知道获得这种效果的唯一方法是将窗口内容渲染到内存中的位图,然后将所需的alpha值应用于非字体像素,然后使用UpdateLayeredWindow()来在窗口上显示位图。您无法使用TForm来实现这种效果,因为它依赖于SetLayeredWindowAttributes()

创建一个32位位图并使用alpha值在其上绘制所需的背景,使用单独的数组来跟踪要绘制文本的点中的当前像素值,然后绘制实际文本并使用数组检测哪些像素已更改,以便您可以从这些像素中清除Alpha值。然后显示位图。

答案 2 :(得分:2)

您可以通过将两个表单相互分层来获得一些东西。将底部窗体的颜色设置为蓝色,启用AlphaBlend,并将AlphaBlend设置为100,这样只提供蓝色背景。

在第二个表单上,将TransparentColor设置为clBtnFace,并将标签放在那里。将标签字体的质量设置为fqAntialiased。

将两个表单的BorderStyle设置为bsNone。

将第二张表格放在第一张表格上,然后你去。

如果您不打算让用户移动表单,或者将它们一起移动,这可能是可行的。