如何实现半透明的并且是柔和的那种阴影效果?(20分)

  • 主题发起人 主题发起人 wgqsoft
  • 开始时间 开始时间
W

wgqsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
像 Photoshop 那种投影效果,我主要是想用在程序的启动屏幕上。
要求阴影必须与桌面完全融合,即关键是从里到外逐渐透明。
 
用个掩膜
 
你说的半透明我知道,但后面那几句我不太明白,半透明的方法如下:
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, 100, LWA_ALPHA);
//第二个参数是指定透明颜色
//第二个参数为0则使用第四个参数设置alpha值,从0到255,其他的我不太清楚,因为没有api帮助
end;

end.
 
这个是实现你窗体半透明效果,不知能否有所帮助
透明度在下面函数第三个参数设置:从0到255,0为全透明,255为不透明
SetLayeredWindowAttributes (handle, 0, 100, LWA_ALPHA);
 
关键是如何在一个窗体上,实现不同像素点的不同透明度。
 
楼上这个兄弟的半透明效果在98下行不?
 
使用 PNG 文件

现在不考虑支持,98, 我们要向前看,至少得是 Win2k
 
现在不考虑支持,98, 我们要向前看,至少得是 Win2k
就是这个理!
 
要整个窗体半透明很好办,只要设置窗体的 Alphablend、AlphablendValue 两个属性就能实现,关键是如何从窗体的一个位置到另一个位置,实现从完全不透明到完全透明。这样才能实现我说的那种与桌面完全融合的阴影效果。
 
http://lysoft.lz169.com/kingron/alpha.html
 
啊~~~~~~~不管是什么系统 找个png图片不就行了,把png图片做成半透明的,想怎么透明就怎么透明

你不是要ps的效果吗,先用ps把你要做的图片做出来存成png格式,然后直接加载就行了
用pngimage显示那个png图片

一行多余的代码都不用写
 
to hs-kill

我试了你说的方法,从 Photoshop 中直接将带阴影的图片保存为 PNG 文件,
加载到已经设置了透明色的窗体上后,设计阶段可以看出来,不管窗体是什么颜色,阴影确实与窗体完全融合了。但运行后,窗体透明了,图片还是老样子,阴影部分还是有一块白色相伴,很难看。和用一个透明的 BMP 是一样的效果啊!

是不是制作 PNG 的时候,需要遵循什么规则啊?
 
啊哦........半透明啊,抱歉抱歉,没注意

不过,如果你只是要实现启动界面(也就是说不会移动窗体,并且停留时间不长),可以这么做:
//这样做缺点就是,如果程序下面的内容变化了,程序本身是不会同步更新的....不过用在启动界面上似乎问题不大
private
{ Private declarations }
PROCEDURE CMEraseBkgnd(var Message:TWMEraseBkgnd);Message WM_ERASEBKGND;
...

PROCEDURE Tform1.CMEraseBkgnd(var Message:TWMEraseBkgnd);
BEGIN
brush.style:=bsClear;
Inherited;
END;
 
to hs-kill
你的方法不行啊!怎么照抄了你的代码后,窗体成了黑色的,更不透明了!
 
to hs-kill
噢!我明白了,你的方法不需要设置窗体的 TransparentColor 。
 
呵呵 是啊 因为半透明的颜色不属于TransparentColor,所以这个属性没用,忘了和你说了
 
尽管效果不太好,也只能这样了!
 
后退
顶部