你能告诉我为此目的所需的功能名称吗?我正在使用Delphi XE 5.我想得到这个效果:
窗口:半透明
字体:完全可见。
我将使用“系统”字体(AA的零问题)
我在MSDN上看到什么?我需要使用哪些功能(名称)?
答案 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。
将第二张表格放在第一张表格上,然后你去。
如果您不打算让用户移动表单,或者将它们一起移动,这可能是可行的。