首页  编辑  

如何制作立体窗口阴影效果

Tags: /超级猛料/VCL/Form,窗体/窗体特效/   Date Created:

   软件设计中有一块内容相当的重要,那就是软件设计,软件设计中的软件界面的设计是比较直观的东西。一套好的软件除了要有良好的架构,良好的底层设计,软件界面也是相当重要的。当然这里不是讲如何设计软件,只是贴出这篇文章,抛砖引玉而已。

界面的效果可以有很多种表现方式,呵呵,今天看到套软件居然能有这样的效果,窗体的右边及窗体的下部有阴影效果。不错,尝试了做一下,效果还可以,和大家一起来分享!

原理:

在一个窗口的右边和窗口的下部各添加一个窗体,用于做阴影显示,从而产生立体效果。

在窗体的Interface中定义了以下几个变量:

 private

   ShadowWidth:integer;//主要用于确定阴影的宽度或高度,也可以设计成Const类型

   RightShadow:TForm;//主窗口的右边产生一个阴影窗口

   BottomShadow:TForm;//主窗口的下部产生一个阴影窗口

用户在移动主窗体的时候,要让两个阴影窗口随之移动,所以要重载下窗口移动的消息WM_WindowPosChanged;

 private

   procedure WMWindowPosChanged(var Msg:TWMWindowPosChanged);message wm_windowposchanged;

实现部分如下:

 begin

   inherited;

   if Assigned(RightShadow) and RightShadow.Visible then

     FormResize(nil);

 end;

在implementation定义下几个常量:

const

 //在函数for SetLayeredWindowAttributes中用到的常量

 lwa_Alpha =2;

 //窗口布局的扩展

 ws_ex_layered =$80000;//关键

调用uer32.dll中的函数SetLayeredWindowAttributes,直接放入implementation部分中。

function SetLayeredWindowAttributes(wnd:HWND;ckKey:COLORREF;

                                   bApha:Byte;dwFlags:Cardinal):bool;stdcall;

                                   external 'user32.dll';

在主窗体生成的时候,动态产生两个阴影窗口并设置他们的窗体样式(STYLE)

procedure TForm1.FormCreate(Sender: TObject);

begin

 ShadowWidth:=7;

 RightShadow:=TForm.Create(self);

 with RightShadow do

 begin

   parent :=Application.MainForm;

   BorderStyle :=bsNone;

   Width :=ShadowWidth;

   Color :=clBlack;

   Visible :=true;

 end;

 SetWindowLong(RightShadow.Handle,gwl_exstyle,GetWindowLong(RightShadow.Handle,gwl_exstyle)or ws_ex_layered);

 SetLayeredWindowAttributes(RightShadow.Handle,0,150,lwa_Alpha);

 BottomShadow:=TForm.Create (self);

 with BottomShadow do

 begin

   parent :=Application.MainForm;

   BorderStyle :=bsNone;

   Height :=ShadowWidth;

   Color :=clBlack;

   Visible :=true;

 end;

 SetWindowLong(BottomShadow.Handle,gwl_exstyle,GetWindowLong(BottomShadow.Handle,gwl_exstyle)or ws_ex_layered);

 SetLayeredWindowAttributes(BottomShadow.Handle,0,150,lwa_Alpha);

 FormResize(Sender);

end;

在窗体中要重画整个窗体,所以使用FormResize,注意要调节好整个窗体的布局。

procedure TForm1.FormResize(Sender: TObject);

begin

 RightShadow.Height :=Height;

 RightShadow.Left :=Left+Width;

 RightShadow.Top :=Top+ShadowWidth;

 BottomShadow.Width :=Width-ShadowWidth;

 BottomShadow.Left :=Left+ShadowWidth;

 BottomShadow.Top :=Top+Height;

end;

到此,整个过程完成,大家可以去看看她的效果了。