做一个有投影效果的Panel,第一次做控件,希望大家帮助一下(50分)

  • 主题发起人 主题发起人 rblong
  • 开始时间 开始时间
R

rblong

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,做一个带投影(即阴影)效果的Panel。我是第一次做控件,参考了很多panel控件,就是没找到我想的效果!是不是很难?一般的panel控件,东西都做在里面,而这个效果要画在panel的外面!参考不到什么好东西,故来这里寻求帮助!
 
不难的。你从TGraphicControl上继承,在构建函数中显示一个Panel,然后在边上画阴影就行了
 
已经有了 叫 DSPANEL ,你做些别人没有的,以后公开一下,大家都会感谢你的。
 
我先前做了一个,从panel继承,再在里面画一个新的panel 下面的阴影用label做!效果是有了,但问题多多。在设计期画了控件,在运行期就消失了,郁闷
 
to mstar
找不到啊!能不能发我一个!谢谢啊
email:rblong@163.com

-----------------------
找到了!
http://www.torry.net/enhancedpanels.htm
 
应该继承Paint过程,在Paint过程中画就行
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function BlendColors( ForeColor, BackColor: TColor; Alpha: Byte ): TColor;
var
ForeRed, ForeGreen, ForeBlue: Byte;
BackRed, BackGreen, BackBlue: Byte;
BlendRed, BlendGreen, BlendBlue: Byte;
AlphaValue: Single;
begin
AlphaValue := Alpha / 255;

ForeColor := ColorToRGB( ForeColor );
ForeRed := GetRValue( ForeColor );
ForeGreen := GetGValue( ForeColor );
ForeBlue := GetBValue( ForeColor );

BackColor := ColorToRGB( BackColor );
BackRed := GetRValue( BackColor );
BackGreen := GetGValue( BackColor );
BackBlue := GetBValue( BackColor );

BlendRed := Round( AlphaValue * ForeRed + ( 1 - AlphaValue ) * BackRed );
BlendGreen := Round( AlphaValue * ForeGreen + ( 1 - AlphaValue ) * BackGreen );
BlendBlue := Round( AlphaValue * ForeBlue + ( 1 - AlphaValue ) * BackBlue );

Result := RGB( BlendRed, BlendGreen, BlendBlue );
end;

procedure DrawDropShadow( Canvas: TCanvas; Bounds: TRect; Depth: Integer; ShadowColor: TColor = clBlack );
var
A, D, I: Integer;

procedure DrawShadow( Offset, Alpha: Integer );
var
X, Y: Integer;
begin
// 4 ***
// *
// *
// 3 *
// * *
// 1 * 2 *
// ***********************

// Step 1
X := Bounds.Left + 2*Depth - Offset;
for Y := Bounds.Bottom - 1 to Bounds.Bottom - 1 + Offset - 1 do
Canvas.Pixels[ X, Y ] := BlendColors( ShadowColor, Canvas.Pixels[ X, Y ], Alpha );
Inc( X );
Y := Bounds.Bottom - 1 + Offset - 1;
Canvas.Pixels[ X, Y ] := BlendColors( ShadowColor, Canvas.Pixels[ X, Y ], Alpha );

// Step 2
Y := Bounds.Bottom - 1 + Offset;
for X := Bounds.Left + 2*Depth - Offset + 1 to Bounds.Right + Offset - 2 do
Canvas.Pixels[ X, Y ] := BlendColors( ShadowColor, Canvas.Pixels[ X, Y ], Alpha );
Dec( Y );
X := Bounds.Right + Offset - 2;
Canvas.Pixels[ X, Y ] := BlendColors( ShadowColor, Canvas.Pixels[ X, Y ], Alpha );

// Step 3
Y := Bounds.Top + 2*Depth - Offset;
for X := Bounds.Right - 1 to Bounds.Right - 1 + Offset - 1 do
Canvas.Pixels[ X, Y ] := BlendColors( ShadowColor, Canvas.Pixels[ X, Y ], Alpha );
Inc( Y );
X := Bounds.Right - 1 + Offset - 1;
Canvas.Pixels[ X, Y ] := BlendColors( ShadowColor, Canvas.Pixels[ X, Y ], Alpha );

// Step 4
X := Bounds.Right - 1 + Offset;
for Y := Bounds.Top + 2 * Depth - Offset + 1 to Bounds.Bottom + Offset - 2 do
Canvas.Pixels[ X, Y ] := BlendColors( ShadowColor, Canvas.Pixels[ X, Y ], Alpha );
end;

begin
if Depth <= 0 then
Exit;
D := 128 div Depth;
A := 128;
for I := 1 to Depth do
begin
DrawShadow( I, A );
Dec( A, D );
end;
end;


procedure TForm1.FormPaint(Sender: TObject);
begin
DrawDropShadow(Canvas,Panel1.BoundsRect,6);
end;

end.




object Form1: TForm1
Left = 192
Top = 107
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnPaint = FormPaint
PixelsPerInch = 96
TextHeight = 13
object Panel1: TPanel
Left = 168
Top = 72
Width = 217
Height = 193
Caption = 'Panel1'
TabOrder = 0
end
end

 
没错 他已经很不错了
 
你如果精力很足 做个这样的东西好了 在IDE环境下 点任何一个 DATASET 控件 都可以生成
1、 他的SQL代码 例如 select bh,mc ... from
2、 他的赋值代码 例如 table1bh.asstring := ...
 
用二个sharp就是你要的效果!
 
to mastar
不要期望我做那样的东西,现在连panel都搞不定

to hfghfghfg
这个效果我看到过,但我们的美工要求我做简单的单色,不要那么复杂,说看起来太花俏了!郁闷~~

我现在碰到的最主要的问题,不是效果了!而是我的方法的问题!再panel_a里再画一个panel_B ,生成控件!可系统竟然不知道 那个panel_b 也是一个容器,可以放东西,所以在设计的时候东西都在,可一运行,都没了!

以下是代码,能看的帮我看看,问题出在哪?谢谢

unit ShadowPanel;
interface

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

type
TShadowPanel = class(Tpanel)
private
{ Private declarations }
IsShowShadow:Boolean;//是否显示投影
FAbout:string;//关于
Fversion:String;//版本
ShadowWidth:integer;//投影宽度
BgBorderWidth,BgHeight,BgWidth:integer;//边距
posleft,postop,poswidth,posheight:integer;//位置定位

procedure SetAbout(Value:string);//关于
procedure SetVer(Value:string); //版本
procedure SetPosition;//定位
protected
{ Protected declarations }
CasePnl:Tpanel;//控见容器及界面
ShadowLbl:Tlabel;//投影
procedure SetFrontColor(FrontColor:Tcolor);//前台颜色
procedure SetShadowColor(ShadowColor:Tcolor);//投影颜色
procedure SetShadowWidth(SWidth:Integer);//投影宽度
procedure SetShowShadow(const Value: boolean);
Function GetFrontColor:Tcolor; //获得前台颜色
Function GetShadowColor:Tcolor; //获得背景颜色
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
// Procedure Paint; override;

published
{ Published declarations }
property spFrontColor:Tcolor read GetFrontColor Write SetFrontColor;
Property spShadowColor:Tcolor read GetShadowColor Write SetShadowColor;
Property spShadowWidth:integer read ShadowWidth Write SetShadowWidth default 4;
Property spIsIShowShadow:boolean read IsShowShadow Write SetShowShadow default True;
Property spAbout:String read FAbout Write SetAbout;
Property spVersion:string read FVersion Write SetVer;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Standard', [TShadowPanel]);
end;

{ TShadowPanel }

constructor TShadowPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FAbout:='ShadowPanel';
FVersion:='1.00';

//Set value
Isshowshadow:=true;

// Set My Self
ParentColor:=true;
BevelOuter:=bvnone;
Ctl3D:=false;
BorderWidth:=4;
BorderStyle:=bsnone;
Caption:='';

// Set Position
ShadowWidth:=4;//投影宽度
BgBorderWidth:= BorderWidth;
BgHeight:=height;
BgWidth:=Width;
setposition;

//create shadowlbl

if IsShowShadow then //如果要显示阴影,则创建LBL
begin
shadowlbl:=tlabel.Create(self);
with shadowlbl do
begin
Parent:=self; //怎么写?
AutoSize:=false;
Color:=clgray;
Left:=posleft+shadowWidth;
Top:=postop+shadowWidth;
Width:=poswidth;
Height:=posheight;
Anchors:=[akLeft,akTop,akRight,akBottom];
end;
end;

//create CasePnl
casepnl:=tpanel.Create(self);
with casepnl do
begin
parent:=self;
color:=$00D9ECF4;
Left:=posleft;
Top:=postop;
Width:=poswidth;
Height:=posheight;

Bevelinner:=bvnone;
BevelOuter:=bvnone;
BorderStyle:=bsnone; //这个属性有问题,设计期和运行期不一样 郁闷
Ctl3D:=true;
Anchors:=[akLeft,akTop,akRight,akBottom];
Caption:='';
end;
end;

function TShadowPanel.GetFrontColor: Tcolor;
begin
result:=casepnl.Color;
end;

function TShadowPanel.GetShadowColor: Tcolor;
begin
result:=shadowlbl.Color;
end;


procedure TShadowPanel.SetAbout(Value: string);
begin
FAbout:='ShadowPanel';
end;

procedure TShadowPanel.SetFrontColor(FrontColor: Tcolor);
begin
casepnl.Color:=frontcolor;
end;

//定位 获得位置
procedure TShadowPanel.SetPosition;
begin
if isshowshadow then
begin
posleft:=BgBorderWidth;
postop:=BgBorderWidth;
poswidth:=BgWidth-BgBorderWidth*2 -shadowWidth;
posheight:=BgHeight-BgBorderWidth*2 -shadowWidth;
end
else
begin
posleft:=BgBorderWidth;
postop:=BgBorderWidth;
poswidth:=BgWidth-BgBorderWidth*2;
posheight:=BgHeight-BgBorderWidth*2;
end;
end;

procedure TShadowPanel.SetShadowColor(ShadowColor: Tcolor);
begin
shadowlbl.Color:=shadowcolor;
end;


procedure TShadowPanel.SetShadowWidth(SWidth: Integer);
begin
if swidth <> shadowwidth then shadowwidth:=swidth;
end;

procedure TShadowPanel.SetShowShadow(const Value: boolean);
begin
IsShowShadow:=value;
end;

procedure TShadowPanel.SetVer(Value: string);
begin
Fversion:='1.00';
end;

end.
 
大家是否研究过Dex express 的 cxTextedit 的投影效果!
我觉的外面有个东西包着,然后里面一个edit 投影大概也是label画出来的,或者是直接画出来的!我做的就是这种效果,但我不知道,把edit和label包起来的那个是什么东西!
当设置cxtextedit的style->shadow 为true 里面的edit宽度会缩小,外面包的那个容器,高度会增加,从而画出投影
 
帮自己顶一下!
 
感谢各位,问题解决。
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
887
DelphiTeacher的专栏
D
后退
顶部