窗体透明效果(100分)

  • 主题发起人 主题发起人 blackcow
  • 开始时间 开始时间
B

blackcow

Unregistered / Unconfirmed
GUEST, unregistred user!
在DELPHI中怎样使Form的颜色变成透明状态,希望高手快快告诉我
 
是不是变成全透明,把背景都看到?
 
将一个FORM变成透明的实质性手段就是拦截CMEraseBkgnd消息。
unit Utransform;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm)
private { Private declarations }
public { Public declarations }
PROCEDURE CMEraseBkgnd(var Message:TWMEraseBkgnd);Message WM_ERASEBKGND;
end;

var Form1: TForm1;
implementation
{$R *.DFM}
PROCEDURE Tform1.CMEraseBkgnd(var Message:TWMEraseBkgnd);
begin

brush.style:=bsClear;
Inherited;
end;

end.
 
在create事件内加入:
alphablendvalue 越大越有物质感,越小越透明。
form1.AlphaBlend := true;
form1.AlphaBlendValue :=200;
 
同意“雪鹰”,呵呵 顺便接分!
 
雪鹰 的做法在D5,或者98下无效,这个问题讨论很多,搜索一下吧。
 
lichdr的方法可以实现全透明,但上面的代码不能重画窗口,当别人窗口内容出现在透明窗口的范围内时,该透明窗口就不能涮新,需要最小化后再正常显示才行涮新,再被盖住时又不行了。
雪鹰的方法在win98下面没作用
 
雪鹰的方法是对的,但是那要看你的版本了,我用的是7.0的可以用的啊,并没出什么错啊
 
来自:cnsandboy, 时间:2003-8-30 11:11:00, ID:2144487
雪鹰 的做法在D5,或者98下无效,这个问题讨论很多,搜索一下吧。
 
你还可以在打开应用程序时让它从透明到不透明的,下面的代码就可以实现。
在OnPaint事件中加入如下代码:
var
i:byte;
begin

for i:= 0 to 255do

begin

AlphaBlendValue:=i;
end;

end;

按F9看看吧,是不是很帅!
 
PROCEDURE CMEraseBkgnd(var Message:TWMEraseBkgnd);Message WM_ERASEBKGND;
end;

var Form1: TForm1;
implementation
{$R *.DFM}
PROCEDURE Tform1.CMEraseBkgnd(var Message:TWMEraseBkgnd);
begin

brush.style:=bsClear;
Inherited;
end;

end.
 
利用api
AnimateWindow(form1.handle,300,AW_BLEND or AW_HOR_POSITIVE);//显示
AnimateWindow(self.handle,300,AW_HIDE or AW_BLEND or AW_HOR_POSITIVE);//隐藏
 
将Form中的AlphaBlend没为True
再将AlphaBlendValue设为220,就是半透明的了
设得越小越透明。
 
演示如何获得本机IP地址,如何生成透明窗口,如何从任务条上隐藏
http://www.csdn.net/dev/delphi/Samples/myip.zip
 
是不是表面上透明?????
即点击透明地方是窗体呢还是到背景????
呵呵~~~~~~~~~~~~~~~~~~~~
 
我记得“源码空间”有这样子的一个例子,去下载下来看看吧!
 
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
Button2: TButton;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
proceduredo
Visible;
proceduredo
Invisible;
public
{ Public declarations }
end;

var
Form1: TForm1;
FullRgn, ClientRgn, CtlRgn : THandle;
implementation
{$R *.DFM}
procedure TForm1.DoInvisible;
var
AControl : TControl;
A, Margin, X, Y, CtlX, CtlY : Integer;
begin

Margin := ( Width - ClientWidth ) div 2;
//取得Form区域
FullRgn := CreateRectRgn(0, 0, Width, Height);
//找到客户区
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );
//遮罩客户区以外区域
CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );
//遍历窗体所有控件,与整个现存区域做OR操作
for A := 0 to ControlCount - 1do
begin

AControl := Controls[A];
if ( AControl is TWinControl ) or ( AControl is TGraphicControl )
then
with AControldo
begin

if Visible then
begin

CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn( CtlX, CtlY, CtlX + Width, CtlY + Height );
CombineRgn( FullRgn, FullRgn, CtlRgn, RGN_OR );
end;

end;

end;

//区域准备完毕,实现之
SetWindowRgn(Handle, FullRgn, TRUE);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

//清空创建的区域
DeleteObject(ClientRgn);
DeleteObject(FullRgn);
DeleteObject(CtlRgn);
end;

procedure TForm1.DoVisible;
begin

//恢复
FullRgn := CreateRectRgn(0, 0, Width, Height);
CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
SetWindowRgn(Handle, FullRgn, TRUE);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

//开始透明
do
Invisible;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

if Button1.Caption = 'Show Form' then
begin

do
Visible;
Button1.Caption := 'Hide Form';
end
else
begin

do
Invisible;
Button1.Caption := 'Show Form';
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

Application.Terminate;
end;

procedure TForm1.FormResize(Sender: TObject);
begin

if Button1.Caption = 'Show Form' then

do
Invisible
else

do
Visible;
end;

end.

 
这是将消息都漏掉啦!!
来个透明度可调的怎么样???!!
在98下哦,2000是很容易做到的,

呵呵~~~~~~~~~~~~~
 
在delphi5.0delphi里只有通过编程来实现了,在delphi 6.0里则可以很轻松实现,窗体的属性有一个叫AlphaBlend 的属性,其值为0~255,把设置成小于255的某个值就可以了;是不是很简单呀!!!
 
我真的难保D5啦,
我要升级到D6~~~~
我只知道在2000用一个函数可以搞定,
98下没有这个函数(据说的,我要下98跑跑),
5555555,
看来我要装个D6来看看是怎么个道理,
呵呵~~~~~~~~~~~~
 
后退
顶部