白送分(问题很简单,所以分不多。请各位大侠饶了我......)(20分)

  • 主题发起人 主题发起人 xieyj
  • 开始时间 开始时间
X

xieyj

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么做一个透明的窗体,比如我如果在窗体里放一张图片的话,可不可以把图片以外的地方
全都设置为透明的。多谢了。
 
透明的窗体其实质性手段就
是拦截了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.
 
如果是半透明的话,D6里直接提供了
你所说得透明不太清楚,不过WM_ERASEBKGND的拦截不是治本的方法,拖动窗口就不行了
你的要求可以用SetWindowRgn(好像是这个名字吧)来实现,也就是个只显示你图片的不
规则窗口
 
antic_ant:
说的行不通啊,它运行时只能将当前的颜色做为背景,场景一换,又是白色背景。
 
kindly说得对,通过注册不规则的window来实现,
如果你看过windows编程的书就会知道,windows
会自动不在注册窗口外绘制图形.
就是描述不规则窗口麻烦点.
 
能否给个具体的代码看一下
 
给你一篇文档,看仔细了。[:)]

半透明窗体
半透明窗体并不是win2000的新特效,凡是用过金山词霸的同志都会发现在屏幕取词设置中有一个半透明背景的选项,这说明在win98下是可以实现半透明窗口的。但我还是要首先谈谈在win2000实现半透明窗体的新函数setlayeredwindowattributes。利用这个函数就可以轻松创建一个半透明窗体,但是利用这个函数的程序编译后在win98下是无法运行的。
setlayeredwindowattributes api函数介绍如下: 函数功能:设置窗口透明颜色 参数:setlayeredwindowattributes( hwnd hwnd, //窗口手柄 colorref crkey, //指定颜色值 byte balpha, //混合函数值 dword dwflags //动作 参数解释: hwnd:窗口句柄。当使用createwindowex函数创建窗口时,窗口由ws_ex_layered指定的值创建;或者窗口已经创建后,由setwindowlong根据ws_ex_layered指定的值改变。 crkey:指向一个color值,该值指定一个透明颜色值,当创建窗口时,窗口将使用该值。 balpha:混合函数值。该值用于描述窗口的不透明度。当balpha 值为0时,窗口完全透明,当balpha值为255时,窗口完全不透明。 dwflags:指定动作。这个参数可以取一个或多个值。用它我们可以创建一个不规则的窗体。
setlayeredwindowattributes函数的api声明: setlayeredwindowattributes(hwnd: hwnd; crkey: dword;balpha: byte; dwflag: dword): boolean; stdcall; ---------
程序代码1: const ws_ex_layered = $80000; lwa_colorkey = $1; lwa_alpha = $2; procedure tform1.formcreate(sender: tobject); var l:longint; begin l :=getwindowlong(handle, gwl_exstyle); l := l or ws_ex_layered; setwindowlong (handle, gwl_exstyle, l); setlayeredwindowattributes(handle, 180, 120, lwa_alpha); end; 还有一些其它的常量定义如: ac_src_alpha = $1; ac_dst_no_premult_alpha = $10; ulw_colorkey = $1; ulw_alpha = $2; ulw_opaque = $400; 等还要参看msdn。
有些我还没有搞明白,如果哪位同志知道的话,请告诉我。 那么在win98下又是如何实现半透明窗体的呢?其基本原理是:在窗口显示前其获取背景图然后对背景图象进行滤镜效果处理再将处理过的背景图象显示在窗口前面。 有一种方法是:首先,做出一个透明窗体,然后在窗体上添加一个shape,将其扩展至全屏幕,将shape的pen的mode属性设为pmmask,pen的style属性设为psclear,最后改变brush的color属性即可。 因为没有api支持,win9x下只能模拟,效果不太好,就象金山词霸的取词窗口,背景改变而窗体上还是不变。但我们可以利用timer控件来解决窗体的刷新率和时时更新的问题。 不过听说“金山词霸的半透明窗口效果只能在带mmx指令集的处理器中才起作用”不知是真是假,由于手头没有这样的电脑,还请同志们自己验证吧。

--------------------------------------------------------------------------------

在windows2000下增加了一些API,可以轻易的实现半透明的窗体,源程序如下,必要的地方我加上了注释
unit Unit1;

interface

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

const
WS_EX_LAYERED = $80000;
AC_SRC_OVER = $0;
AC_SRC_ALPHA = $1;
AC_SRC_NO_PREMULT_ALPHA = $1;
AC_SRC_NO_ALPHA = $2;
AC_DST_NO_PREMULT_ALPHA = $10;
AC_DST_NO_ALPHA = $20;
LWA_COLORKEY = $1;
LWA_ALPHA = $2;
ULW_COLORKEY = $1
ULW_ALPHA = $2
ULW_OPAQUE = $4
//新增加的常量定义

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function SetLayeredWindowAttributes(hwnd:HWND; crKey:Longint; bAlpha:byte; dwFlags:longint ):longint; stdcall; external user32;//函数声明

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var l:longint;
begin
l:=getWindowLong(Handle, GWL_EXSTYLE);
l := l Or WS_EX_LAYERED;
SetWindowLong (handle, GWL_EXSTYLE, l);
SetLayeredWindowAttributes (handle, 0, 180, LWA_ALPHA);
//第二个参数是指定透明颜色
//第二个参数为0则使用第四个参数设置alpha值,从0到255,其他的我不太清楚,因为没有api帮助
end;

end.
 
如果你只想看到图片的画,将form的BorderStyle设为bsnone
在将form的大小设成图片一样的大小就可以了,不必搞什么透明窗口
 
同意luyear,将form的boderstyle设置为bsnone,将image的align属性设为
alclient就行了。做透明窗体还是有点麻烦的.
 
//再简单不过了
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure createparams(var params: Tcreateparams);OVERRIDE; //重载FORMCREATE,!!!
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Brush.Style := bsclear;
form1.borderstyle := bsnone;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.createparams(var params: Tcreateparams);
begin
inherited createparams(params); //!!!
params.exstyle := WS_EX_TRANSPARENT; //!!!
end;

end.
 
接受答案了.
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
744
DelphiTeacher的专栏
D
D
回复
0
查看
718
DelphiTeacher的专栏
D
D
回复
0
查看
672
DelphiTeacher的专栏
D
后退
顶部