编程实现窗体的半透明效果

编程实现窗体的半透明效果 作者:罗蔷 发布时间:2001/03/16
 
文章摘要:
  大家都知道Windows 2000支持淡入淡出的窗体显示效果。如何让自己的应用程序也具备这种效果呢?下文对此问题做出了解答
       

正文: 



编程实现窗体的半透明效果

  

  如果你不是使用Windows2000+Delphi编程的话,我不想浪费你的时间。如果是,请继续。
  大家都知道Windows 2000支持淡入淡出的窗体显示效果。如何让自己的应用程序也具备这种效果呢?前两天研究FormContainer的Form显示效果时(注:FormContainer是一个强大的Delphi特效处理控件,有兴趣的朋友可以访问http://www.billeniumsoft.com/),得高人告知,核心API函数就是SetLayeredWindowAttributes。
  要实现淡入淡出效果,就需要实现窗口的可调整的透明效果。传统的Windows应用程序想实现透明效果,一般来说需要处理自己的窗口的WM_Paint消息,程序员需要GetDC获取屏幕的HDC,调用BitBlt函数将屏幕将要被覆盖的区域拷贝到内存的TBitmap对象中,然后对该Tbitmap的ScanLine二维数组逐象素的修改rgbtRed、rgbtGreen和rgbtBlue值。天哪,实在是太麻烦了。
  Windows2000的API库中终于提供了半透明的窗体显示效果支持(虽然不是很完善)。要实现半透明的窗口效果,首先需要给创建的窗口添加WS_EX_LAYERED 扩展属性,这是一个新的窗口扩展属性,Delphi5并没有定义相应的常量和SetLayeredWindowAttributes函数,我们需要手工声明。

function SetLayeredWindowAttributes(Handle: HWND;
  COLORKEY: COLORREF; Alpha: BYTE; Flags: DWORD): Boolean; stdcall; external 'USER32.DLL';

Const
  WS_EX_LAYERED = $80000;
  LWA_ALPHA = 2;

  我们调用GetWindowLong函数获取当前窗口的扩展属性,并调用SetWindowLong函数将新的WS_EX_LAYERED窗口扩展属性添加进去。

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) or WS_EX_LAYERED);
end;

  现在我们的窗口已经可以调用SetLayeredWindowAttributes函数,通过设置该函数的Alpha参数,我们就可以看到窗口的效果的变化。

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLayeredWindowAttributes(Form1.Handle, 0, 180, LWA_ALPHA);
end;

  以下的VCL控件代码封装了SetLayeredWindowAttributes函数,编程时动态改变AlphaValue值,您就可以看到窗口的透明效果了。控件屏蔽了设计期的显示效果,如果读者愿意可以改为设计期效果可见,不过那样的话,一不小心,您可能就会找不着你要设计的窗体了 8-)

unit TranForm; {DragonPC 2001.2.21 }

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms ;

type
  TTranForm = class(TComponent)
  private
   FAlphaValue : integer ;
   FParentFormHandle : HWND ;
  procedure SetFAlphaValue(Alpha:integer) ;
   protected
   procedure UpdateDisplay ;
public
  constructor Create(AOwner: TComponent); override;
published
  property AlphaValue : integer read FAlphaValue write SetFAlphaValue ;
end;

procedure Register;

function SetLayeredWindowAttributes(Handle: HWND; COLORKEY: COLORREF;
  Alpha: BYTE; Flags: DWORD): Boolean; stdcall; external 'USER32.DLL';

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TTranForm]);
end;

procedure TTranForm.SetFAlphaValue(Alpha: integer);
  begin
   if (Alpha >= 0) and (Alpha < 256) then begin
   FAlphaValue := Alpha ;
   UpdateDisplay() ;
  end;
end;

procedure TTranForm.UpdateDisplay;
begin
 if (csDesigning in ComponentState) then Exit ;
 SetLayeredWindowAttributes(FParentFormHandle, 0, FAlphaValue, 2);
end;

constructor TTranForm.Create(AOwner: TComponent);
begin
  inherited;
  if (csDesigning in ComponentState) then Exit;
  FAlphaValue := 255 ;
  FParentFormHandle := TForm(AOwner).Handle ;
  SetWindowLong(FParentFormHandle,
         GWL_EXSTYLE,
         GetWindowLong(FParentFormHandle, GWL_EXSTYLE) or WS_EX_LAYERED);
end;

end.

  谢谢您的莫大耐心得以看完此文,此文纯粹本着赚取china-pub"假币"目的所写,万一各位看官有任何的疑问,欢迎信至dragonpc@21cn.com,谢谢。


作者会员名:dragonpc

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 要在Unity3D中实现窗体透明,可以按照以下步骤进行操作: 首先,确保你正在使用Unity3D的最新版本。然后,创建一个新的项目或打开现有的项目。 在Unity编辑器中,点击"Window"(窗口)选项卡,然后选择"Package Manager"(包管理器)。在包管理器中,确保你已经安装了"Universal Windows Platform"(通用Windows平台)模块。 接下来,点击"Window"(窗口)选项卡,然后选择"Project Settings"(项目设置)。在项目设置窗口中,选择"Player"(玩家)选项卡,然后点击"XR Settings"(XR设置)下拉菜单。 在XR设置下拉菜单中,选择"Player"(玩家)选项卡,并将"Virtual Reality Supported"(支持虚拟现实)选项设置为关闭。 然后,在"Player"(玩家)选项卡中,点击"Resolution and Presentation"(分辨率和演示)部分的"Run In Background"(在后台运行)复选框,以允许Unity应用在失去焦点时继续运行。 现在,你可以编写自己的代码来实现窗体透明。例如,你可以在脚本中使用"Color"(颜色)类型来设置窗体的背景色,并将Alpha通道值设置为0,以实现全透明效果。 请注意,实现窗体透明可能只在Windows平台有效。在其他平台上,窗体透明可能会有不同的实现方法。 希望这些步骤可以帮助你在Unity3D中实现窗体透明。祝你好运! ### 回答2: 要在Unity3D中实现窗体透明,可以按照以下步骤进行操作: 首先,在Unity3D中创建一个新项目或者打开现有项目。 然后,在Hierarchy视图中创建一个新的空对象(GameObject)。 接下来,在Inspector视图中将空对象的名称设置为"TransparentWindow"。 然后,为了将Unity项目转换为窗体应用程序,需要使用Unity的Build Settings功能。打开菜单栏中的File,选择Build Settings选项。 在Build Settings窗口中,选择目标平台为Windows(或者根据需要选择其他平台)。 点击Player Settings,在Player窗口的Resolution and Presentation选项中,取消勾选Default Is Full Screen。 然后,在Resolution and Presentation选项中取消勾选Run in Background和Fullscreen Window等选项。 接下来,在Player窗口的Other Settings选项卡中,选择Allow Title Bar to Display和Custom Title Bar Style等选项。 然后,在Unity项目的Assets文件夹中创建一个新的C#脚本。 在脚本中,使用System.Runtime.InteropServices命名空间中的[DllImport]特性导入Windows API函数。例如: [DllImport("user32.dll")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 设置窗体参数函数如下: const int GWL_STYLE = -16; const int WS_POPUP = 0x80000000; const int WS_VISIBLE = 0x10000000; 然后,在脚本的Start函数中,获取Unity Player的窗体句柄并调用SetWindowLong函数来设置窗体样式,使其透明: IntPtr hwnd = GetActiveWindow(); SetWindowLong(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE); 最后,将该脚本附加到在Hierarchy视图中创建的"TransparentWindow"对象上。 保存并运行Unity项目,将生成的可执行文件(.exe)作为窗体应用程序打开,应该能够看到透明的窗体。 这些步骤将帮助你在Unity3D中实现窗体透明。记得在操作之前备份项目文件,以防发生意外。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CandyCat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值