`
isiqi
  • 浏览: 16759438 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

绘制玻璃效果

阅读更多

绘制玻璃效果

LinZhenqun

2007-10-5

前言

现代软件对于用户体验的要求越来越高,特别是对于界面,当人们不再喜欢泛味的经典风格时,渐变效果的界面出来了,这一点在Office2003可以体显出来。但现在,渐变效果似乎也不能满足审美要求了,越来越多的软件尝试用玻璃效果来呈现,Vista整个就是玻璃的界面。

玻璃效果的实现大多采用图片的方式,对于资源是很大的浪费;其实用程序的方法也是可以实现的,下面的描述将向你展示玻璃效果如何用程序来实现,所列的代码可以放心地应用到你的工程中。

正文

仔细研究一些玻璃的表面,发现其实可以用渐变来组合,假设有一个矩形区域,那么玻璃效果可以分解成下面的部分:

边框可能不是必须的,但对于一个实体来说,加上边框会显得完整一些,我们将边框分成外边框和内边框,内边框是为了突显一些3D的效果。

渐变分成两个部分,这也是玻璃效果最重要的表现形式,其中的配色将决定玻璃效果的好坏。如何确定渐变的颜色?很简单,找一些玻璃效果的图然后取色就是了,下面是MSN Space的一个效果:

为了不分散代码,我将整个单元列出来,可以直接拷贝到你的工程中,不过希望能保留作者名。

{**********************************************************}
{摘要:玻璃效果的绘制 }
{}
{作者:LinZhenqun }
{日期:2007-10-5 }
{邮件:linzhenqun@gmail.net }
{**********************************************************}

unitGlassUtils;

interface
uses
Graphics,Windows,Classes;

type
{渐变API的声明}
PTriVertex=^TTriVertex;
TTriVertex=packedrecord
x:Longint;
y:Longint;
Red:WORD;
Green:WORD;
Blue:WORD;
Alpha:WORD;
end;
functionGradientFill(DC:HDC;Vertex:PTriVertex;NumVertex:ULONG;
Mesh:Pointer;NumMesh,Mode:ULONG):BOOL;stdcall;

type
{渐变方向:从左到右,从上到下}
TGradDirection=(gdLeftRight,gdTopBottom);

{玻璃效果的颜色配置}
TGlassColorCfg=record
OutBorder,//外框,如果为clNone将不绘制
InBorder,//内框,如果为clNone将不绘制
Grad1Start,//上半部分渐变的开始颜色
Grad1End,//上半部分渐变的结束颜色
Grad2Start,//下半部分渐变的开始颜色
Grad2End:TColor//下半部分渐变的结束颜色
end;

var
{默认颜色配置,蓝色玻璃}
DefGlassColorCfg:TGlassColorCfg=(OutBorder:clBlack;

InBorder:$00E1D0AA;

Grad1Start:$00D1AE7A;

Grad1End:$00B98835;

Grad2Start:$00975F00;

Grad2End:$00C6A46A);

{颜色值转RGB}
procedureGetRGB(C:TColor;outR,G,B:Integer);

{渐变函数}
procedureFillGradient(constCanvas:TCanvas;constARect:TRect;
constStartColor,EndColor:TColor;constDirection:TGradDirection);

{玻璃效果绘制函数}
procedureDrawGlassFace(Canvas:TCanvas;ARect:TRect;
constGlassColorCfg:TGlassColorCfg);

implementation

functionGradientFill;externalmsimg32;

procedureGetRGB(C:TColor;outR,G,B:Integer);
begin
ifInteger(C)<0thenC:=GetSysColor(Cand$000000FF);
R:=Cand$FF;
G:=Cshr8and$FF;
B:=Cshr16and$FF;
end;

procedureFillGradient(constCanvas:TCanvas;constARect:TRect;
constStartColor,EndColor:TColor;constDirection:TGradDirection);
var
Vert:array[0..1]ofTTriVertex;
gRect:TGradientRect;
nMode:Cardinal;
R,G,B:Integer;
begin
vert[0].x:=ARect.Left;
vert[0].y:=ARect.Top;
GetRGB(StartColor,R,G,B);
Vert[0].Red:=Rshl8;
Vert[0].Green:=Gshl8;
Vert[0].Blue:=Bshl8;
vert[0].Alpha:=0;

vert[1].x:=ARect.Right;
vert[1].y:=ARect.Bottom;
GetRGB(EndColor,R,G,B);
Vert[1].Red:=Rshl8;
Vert[1].Green:=Gshl8;
Vert[1].Blue:=Bshl8;
vert[1].Alpha:=0;

gRect.UpperLeft:=0;
gRect.LowerRight:=1;
ifDirection=gdLeftRightthen
nMode:=GRADIENT_FILL_RECT_H
else
nMode:=GRADIENT_FILL_RECT_V;

GradientFill(Canvas.Handle,@vert,2,@gRect,1,nMode);
end;

procedureDrawGlassFace(Canvas:TCanvas;ARect:TRect;
constGlassColorCfg:TGlassColorCfg);
var
R:TRect;
begin
Canvas.Brush.Style:=bsClear;
withGlassColorCfgdo
begin
ifOutBorder<>clNonethen
begin
//外框
Canvas.Pen.Color:=OutBorder;
Canvas.Rectangle(ARect);
end;
ifInBorder<>clNonethen
begin
//内框
InflateRect(ARect,-1,-1);
Canvas.Pen.Color:=InBorder;
Canvas.Rectangle(ARect);
end;
//上下渐变效果
InflateRect(ARect,-1,-1);
withARectdo
R:=Rect(Left,Top,Right,Top+(Bottom-Top)div2);
FillGradient(Canvas,R,Grad1Start,Grad1End,gdTopBottom);
R:=Rect(R.Left,R.Bottom,R.Right,ARect.Bottom);
FillGradient(Canvas,R,Grad2Start,Grad2End,gdTopBottom);
end;
end;

end.

这个单元中FillGradient绘制渐变效果,DrawGlassFace绘制玻璃效果,这两个都是非常有用的界面函数,也算是我的宝贝之一了,若在你的工程中能帮到一些忙,记得感谢一下哦。

TGlassColorCfg是玻璃效果的颜色配置,而DefGlassColorCfg则默认实现了蓝色的玻璃效果,事实上与上面的MSN Space的效果一样。

下面看看怎么用这个单元,新建一个工程,在主窗体上放三个按钮,再放一个PaintBox,主窗体的代码如下:

unitUnit1;

interface

uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,ExtCtrls,GlassUtils;

type
TForm1=class(TForm)
btnBlue:TButton;
pbGlass:TPaintBox;
btnGreen:TButton;
btnBlack:TButton;
procedurepbGlassPaint(Sender:TObject);
procedureFormCreate(Sender:TObject);
procedurebtnGreenClick(Sender:TObject);
procedurebtnBlueClick(Sender:TObject);
procedurebtnBlackClick(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
FGlassColorCfg:TGlassColorCfg;
end;

var
Form1:TForm1;

implementation

{$R*.dfm}

procedureTForm1.pbGlassPaint(Sender:TObject);
begin
DrawGlassFace(pbGlass.Canvas,pbGlass.ClientRect,FGlassColorCfg);
end;

procedureTForm1.FormCreate(Sender:TObject);
begin
FGlassColorCfg:=DefGlassColorCfg;
end;

procedureTForm1.btnGreenClick(Sender:TObject);
begin
//绿色玻璃配色方案
FGlassColorCfg.OutBorder:=clNone;//clBlack
FGlassColorCfg.InBorder:=clNone;//$00C4E3CF;
FGlassColorCfg.Grad1Start:=$00AED2BA;
FGlassColorCfg.Grad1End:=$0067AD7D;
FGlassColorCfg.Grad2Start:=$001F8741;
FGlassColorCfg.Grad2End:=$00359F58;
pbGlass.Invalidate;
end;

procedureTForm1.btnBlueClick(Sender:TObject);
begin
FGlassColorCfg:=DefGlassColorCfg;
pbGlass.Invalidate;
end;

procedureTForm1.btnBlackClick(Sender:TObject);
begin
//黑色玻璃配色方案
FGlassColorCfg.OutBorder:=clBlack;
FGlassColorCfg.InBorder:=$00AFAFAF;
FGlassColorCfg.Grad1Start:=$007D7D7D;
FGlassColorCfg.Grad1End:=$00353535;
FGlassColorCfg.Grad2Start:=clBlack;
FGlassColorCfg.Grad2End:=$0071716A;
pbGlass.Invalidate;
end;

end.

例子工程实现了三个种玻璃效果:蓝色,绿色,和黑色,看看下面的效果图:

效果自我感觉还是可以的,不知你觉得如何?发挥你的灵感与想象力,也许可以配出更加亮丽的颜色来,要记得在这里回馈一下哦。

分享到:
评论

相关推荐

    漂亮的玻璃效果按钮vc

    4. **绘制玻璃效果**:在窗口的消息处理函数中,处理`WM_PAINT`消息,使用`BeginPaint()`和`EndPaint()`函数进行绘制。为了实现玻璃效果,你需要调用`DwmExtendFrameIntoClientArea()`函数,设置窗口的非客户区延伸...

    QT C++ QWidget 自定义头窗口头标+毛玻璃效果

    本教程将探讨如何利用`QWidget`自定义一个带有独特头部设计和毛玻璃效果的窗口。毛玻璃效果,又称模糊效果,能为窗口提供半透明、朦胧的视觉体验,使界面更具现代感和美观度。 首先,我们需要理解`QWidget`的基本...

    C#玻璃按钮控件

    然后,重写`OnPaint`方法以绘制玻璃效果: ```csharp protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; // 使用GDI+绘制玻璃效果 // ... } ``` 在这个方法中...

    MFC实现的窗体毛玻璃效果

    该函数实现将边框区域扩大到客户区,而此时边框区域的绘制,在windows vista和windows 7系统下在开启了毛玻璃效果之后,边框区域自动绘制出毛玻璃的效果,而且该毛玻璃效果会与系统的个性化设置保持一致。...

    VC2010-C#自定义玻璃按钮

    2. 绘制玻璃效果:为了实现玻璃效果,我们需要利用Graphics对象进行绘图。在OnPaint方法中,可以使用Graphics.DrawRectangle或Graphics.FillRectangle方法来绘制具有透明度的矩形区域,模拟玻璃的透明感。同时,可以...

    Qt Windows下的毛玻璃效果

    在本文中,我们将深入探讨如何在Windows平台上使用Qt框架创建具有毛玻璃效果的半透明窗体。Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程。毛玻璃效果,也称为模糊效果,常用于现代用户界面设计中,为用户...

    毛玻璃效果(demo)

    毛玻璃效果,也被称为模糊效果或者“Blur Effect”,在Android应用开发中被广泛用于创建具有视觉吸引力的用户界面。这种效果模拟了真实世界中的玻璃材料,通过模糊背景图像来突出前景元素,使得UI看起来更加现代和...

    毛玻璃效果

    2. **GDI+** 和 **DirectX**:WinForm 通常使用 GDI+ 进行图形绘制,但若要实现毛玻璃效果,可能需要借助 DirectX 或其他底层图形库。DirectX 提供了更强的图形处理能力,可以实现更复杂的模糊效果。 3. **Alpha ...

    c#玻璃按钮

    // 在这里添加绘制玻璃效果的代码 } } ``` #### 绘制玻璃效果 在`OnPaint`方法内,我们可以使用`Graphics`对象来绘制透明背景: ```csharp protected override void OnPaint(PaintEventArgs e) { using (var ...

    QT C++ 实现毛玻璃窗口,透明+模糊效果

    在本文中,我们将深入探讨如何使用QT C++库来实现毛玻璃效果,即窗口的透明度与模糊结合的视觉效果。这种技术常用于现代UI设计,以提供更优雅、时尚的用户界面。我们将通过分析“glassui”这个压缩包中的源代码来...

    窗口毛玻璃效果(c++源码加程序)

    标题中的“窗口毛玻璃效果(c++源码加程序)”指的是使用C++编程语言实现的一种视觉效果,这种效果通常被称作“模糊效果”或“毛玻璃效果”。在现代操作系统如Windows 10中,这种效果常用于窗口背景,使得窗口下方的...

    wpf创建玻璃效果按钮

    本文将深入探讨如何使用WPF创建具有玻璃效果的按钮,为应用程序增添现代感和美观度。 首先,我们需要理解WPF中的按钮控件。在WPF中,按钮是`System.Windows.Controls.Button`类的实例,它提供了多种自定义样式和...

    VB.NET完美实现全Aero窗口

    `DwmExtendFrameIntoClientArea`用于绘制玻璃效果。 3. **自定义结构`Margins`**:用于指定玻璃效果绘制的距离窗体边界的大小。 4. **窗体透明色设置**:通过设置窗体的`TransparencyKey`属性来实现透明效果。 5. **...

    Glass_Message_Box.zip_Cause_pop_vb Pop_vb script

    5. 使用API函数`DrawThemeBackground`来绘制玻璃效果,可能还需要处理透明度和动画效果。 通过分析这个VBScript项目,开发者可以学习到如何利用脚本语言与操作系统进行低级别交互,创建自定义界面元素,以及如何在...

    VB 窗口透明+玻璃效果+磨砂效果

    - 由于扩展的磨砂玻璃效果会被默认的窗口前景覆盖,我们需要手动绘制一个透明前景。 - 可以通过在窗口的 `Form_Paint` 事件中使用全透明颜色 (0x00000000) 来实现。 ```vb Private Sub Form_Paint() Dim dc As ...

    wpf 实时毛玻璃 live blur 效果

    在本篇中,我们将深入探讨如何在WPF应用中实现这种实时毛玻璃效果。 首先,理解毛玻璃效果的基本原理。毛玻璃效果通常是通过将背景图像进行模糊处理来实现的。在WPF中,我们可以利用`VisualBrush`和`Effect`来完成...

    Silverlight玻璃效果按钮

    总的来说,创建Silverlight玻璃效果按钮涉及多个方面,包括图形绘制、颜色渐变、动画效果以及交互逻辑。熟练掌握这些技术,不仅可以提升应用的视觉效果,还能提高用户的互动体验。对于Silverlight开发者来说,这是一...

    Android 局部毛玻璃透明效果

    毛玻璃效果,也称为模糊效果,通常是指将图像或背景进行一定程度的高斯模糊处理,使其看起来像被一层半透明的、模糊的材质覆盖。在Android平台上,我们可以使用多种方法实现这种效果,比如通过渲染脚本、Bitmap的...

    (C#) 玻璃效果按钮

    在C#编程中,创建具有玻璃效果的按钮是一种常见的需求,尤其在追求现代、美观的用户界面设计时。"VistaButton"就是这样一个例子,它模仿了微软Windows Vista操作系统中的玻璃风格按钮,提供了吸引人的视觉体验。在这...

    MFC实现毛玻璃效果

    毛玻璃效果通过半透明的、模糊的背景,为用户界面带来了轻盈和现代感。在MFC(Microsoft Foundation Classes)框架下,开发者可以利用API函数来实现这种效果,使应用程序看起来更加美观和专业。 本文将详细介绍如何...

Global site tag (gtag.js) - Google Analytics