如何创建有阴影的窗体(50分)

  • 主题发起人 主题发起人 lohmann
  • 开始时间 开始时间
L

lohmann

Unregistered / Unconfirmed
GUEST, unregistred user!
看到有些软件--比如雪狐的桌面日历--的界面非常不错,那些窗体有比较柔和的阴影,感觉很好,不禁心里痒痒,也想做一款。

分析之后觉得他们应该是将一张带Alpha通道的PNG图片搁在了窗体之上,然后将窗体弄成透明,利用图片的阴影来模拟窗体的阴影。程序妙就妙在如何使得窗体透明上头,如果用D7中的设置窗体Alpha value的话,那么图像也会半透明,肯定不行;但是使用TransparentColor属性的方法也不行,会有一个讨厌的底色方框;在窗体的Paint事件中设置Form.Brush.Style:=bsClear也不好,背后的东西会跟着一块儿走的。

他们似乎都用到了GDIPlus.dll,难道是其中的某些函数?我对GDI一窍不通,有哪位大虾能够指点迷津?谢谢。
 
以下来自YourBase 2003 资料管理软件 + 完部源代码,很漂亮的ShadowForm,
不过用到了第三方控件Developer ExpressBar 5.1
http://www.2ccc.com/article.asp?articleid=265
http://downloads.2ccc.com/general/database/YourBase2003.rar
-----------------------------------------------------------
unit CAbout;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, RzPanel, StdCtrls, RzLabel, dxBar, RzStatus;
type
TfAbout = class(TForm)
RzPanel1: TRzPanel;
Image1: TImage;
RzLabel1: TRzLabel;
RzLabel2: TRzLabel;
Label1: TLabel;
VerInfoLabel: TLabel;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
private
FormShadow : TdxBarShadow;
HShadowCtrl : TdxBarShadowPart;
VShadowCtrl : TdxBarShadowPart;
procedure pUpdateShadowPos;
protected
procedure WMMoving(var Message: TWMMoving); message WM_MOVING;
public
end;
var
fAbout: TfAbout;
implementation
{$R *.dfm}

procedure TfAbout.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
{ 关闭 }
Close;
end;

procedure TfAbout.FormCreate(Sender: TObject);
begin
{ 创建窗口 }
Image1.Picture.LoadFromFile(pGetCurDir+'Graphics/AboutBitmap.bmp');

FormShadow := TdxBarShadow.Create(Self);
FormShadow.Visible := True;
HShadowCtrl := TdxBarShadowPart.CreateEx(FormShadow,spHorizontal,[scRight,scTop,scLeft]);
VShadowCtrl := TdxBarShadowPart.CreateEx(FormShadow,spVertical,[scRight,scTop,scLeft]);

VerInfoLabel.Caption := '简体中文语系(Builder '+VI.FileVersion+')';
end;

procedure TfAbout.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{ 关闭窗口 }
HShadowCtrl.Free;
VShadowCtrl.Free;
FormShadow.Free;
end;

procedure TfAbout.pUpdateShadowPos;
var
R : TRect;
begin
inherited;
{ 更新影子位置 }
R.Left := Left + Width;
R.Top := Top + 3;
R.Right := R.Left + 5;
R.Bottom := R.Top + Height - 2;
VShadowCtrl.UpdateBounds(R);

R.Left := Left + 5;
R.Top := Top + Height;
R.Right := R.Left + Width - 2;
R.Bottom := R.Top + 5;
HShadowCtrl.UpdateBounds(R);
end;

procedure TfAbout.WMMoving(var Message: TWMMoving);
begin
{ 移动窗口时也移动影子 }
inherited;
pUpdateShadowPos;
end;

procedure TfAbout.FormActivate(Sender: TObject);
begin
{ 初始化窗口 }
pUpdateShadowPos;
end;

end.
 
要用到canvas手工重绘的吧
 
YourBase 2003 里没有看到有阴影的窗体啊
 
http://kingron.delphibbs.com --> VCL.可视组件 --> Forms.窗体 --> 窗体特效 --> 窗体的Alpha通道透明支持
http://lysoft.lz169.com/kingron/index.html
 
Your Base 2003的About窗口不就是嗎
 
To:BrainYang,

不好意思还没有来得及看代码,不过得谢谢你。

不过凭直观感觉,这跟雪狐的阴影风格还是有区别,它的阴影是由PNG图片中的灰色部分来体现的,而且由于Alpha通道的支持,它的阴影是半透明的。

继续讨论。
 
帮顶!

http://www.source520.com

站长开发推广同盟 站长朋友的终极驿站
同时拥有海量源码电子经典书籍下载

http://www.source520.com/search/search.asp

"编程.站长"论坛搜索引擎-----为中国站长注入动力!
 
我感觉应该有高手知道这个问题的解决办法,毕竟有那么多的软件摆在那里。希望有人出来指点迷津。
 
http://lysoft.lz169.com/kingron/alpha.html
 
后退
顶部