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

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

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

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

在窗体的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;

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

原文地址:https://www.cnblogs.com/blogpro/p/11446856.html