mbshareat
یک شنبه 26 شهریور 1391, 18:07 عصر
سلام
(مثال این تاپیک رو جایگزین و یک کم ساده تر کردم)
من دارم یه کامپوننت دکمه طراحی می کنم که یه بیت مپ بهش میدم که بیت مپ رو دو تکه میکنه و مثل دکمه Play/Pause برای دو حالت استفاده می کنه.
وقتی کامپوننت ساخته میشه هم یه ترسیم توی Canvas بیت مپ انجام میده.
نمی دونم چرا وقتی در زمان طراحی بیت مپ رو بهش آدرس میدم، درست عمل می کنه؛ اما در زمان اجرا اینگار هیچ بیت مپی به پراپرتی پاس داده نشده و همون تصویر اولیه رو نشون میده!
لطفا شما هم یه نگاهی بکنین:
TTwoStatusBut= class(TGraphicControl)
Private
FBmp : TBitmap;
Bmp1,Bmp2:TBitmap;
Status:Byte;//0=Up;1=Over;2=Down;
procedure SetBmp(B:TBitmap);
procedure Click;OverRide;
public
constructor Create(AOwner: TComponent);Override;
procedure Paint;OverRide;
Published
property ShowHint;
property Anchors;
property Bmp:TBitmap read FBmp write SetBmp;
property OnClick;
end;
.
.
implementation
.
.
{ T2StatusBmpBut }
procedure TTwoStatusBut.Click;
begin
Status:=1-Status;
Invalidate;
inherited;
end;
constructor TTwoStatusBut.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
SetParent(TWinControl(AOwner));
Status:=0;
FBmp:=TBitmap.Create;
FBmp.PixelFormat:=pf24Bit;
FBmp.Width:=40;
FBmp.Height:=20;
FBmp.Canvas.Brush.Color:=clBlack;
FBmp.Canvas.FillRect(FBmp.Canvas.ClipRect);
FBmp.Canvas.Pen.Color:=clBlue;
FBmp.Canvas.Brush.Color:=clWhite;
FBmp.Canvas.Ellipse(0,0,20,20);
FBmp.Canvas.Ellipse(20,0,40,20);
FBmp.Canvas.Pen.Color:=clGreen;
FBmp.Canvas.Brush.Color:=clLime;
FBmp.Canvas.Polygon([Point(7,5),Point(14,10),Point(7,15)]);
FBmp.Canvas.Pen.Color:=clBlue;
FBmp.Canvas.Brush.Color:=clAqua;
FBmp.Canvas.Rectangle(25,5,29,15);
FBmp.Canvas.Rectangle(31,5,35,15);
Bmp1:=TBitmap.Create;
Bmp2:=TBitmap.Create;
SetBmp(FBmp);
end;
procedure TTwoStatusBut.Paint;
begin
If Status=0 then
Canvas.Draw(0,0,Bmp1)
Else If Status=1 then
Canvas.Draw(0,0,Bmp2);
inherited;
end;
procedure TTwoStatusBut.SetBmp(B: TBitmap);
Var
W2:Word;
begin
FBmp.Assign(B);
W2:=B.Width Div 2;
Width:=W2;
Height:=B.Height;
Bmp1.Width:=W2;
Bmp1.Height:=B.Height;
Bmp1.PixelFormat:=pf24Bit;
Bmp1.Transparent := True;
Bmp1.TransparentMode:= tmAuto;
Bmp2.Assign(Bmp1);
Bmp1.Canvas.CopyRect(Bmp1.Canvas.ClipRect
,B.Canvas,Rect(0,0,W2,B.Height));
Bmp2.Canvas.CopyRect(Bmp2.Canvas.ClipRect
,B.Canvas,Rect(W2,0,W2*2,B.Height));
Invalidate;
end;
در ابتدای پروسیجر SetBmp با SaveToFile بررسی کردم در زمان اجرا چیزی که به پراپرتی میده همون تصویر اولیه هستش نه بیت مپی که در زمان طراحی بهش مسیر دادم!
(مثال این تاپیک رو جایگزین و یک کم ساده تر کردم)
من دارم یه کامپوننت دکمه طراحی می کنم که یه بیت مپ بهش میدم که بیت مپ رو دو تکه میکنه و مثل دکمه Play/Pause برای دو حالت استفاده می کنه.
وقتی کامپوننت ساخته میشه هم یه ترسیم توی Canvas بیت مپ انجام میده.
نمی دونم چرا وقتی در زمان طراحی بیت مپ رو بهش آدرس میدم، درست عمل می کنه؛ اما در زمان اجرا اینگار هیچ بیت مپی به پراپرتی پاس داده نشده و همون تصویر اولیه رو نشون میده!
لطفا شما هم یه نگاهی بکنین:
TTwoStatusBut= class(TGraphicControl)
Private
FBmp : TBitmap;
Bmp1,Bmp2:TBitmap;
Status:Byte;//0=Up;1=Over;2=Down;
procedure SetBmp(B:TBitmap);
procedure Click;OverRide;
public
constructor Create(AOwner: TComponent);Override;
procedure Paint;OverRide;
Published
property ShowHint;
property Anchors;
property Bmp:TBitmap read FBmp write SetBmp;
property OnClick;
end;
.
.
implementation
.
.
{ T2StatusBmpBut }
procedure TTwoStatusBut.Click;
begin
Status:=1-Status;
Invalidate;
inherited;
end;
constructor TTwoStatusBut.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
SetParent(TWinControl(AOwner));
Status:=0;
FBmp:=TBitmap.Create;
FBmp.PixelFormat:=pf24Bit;
FBmp.Width:=40;
FBmp.Height:=20;
FBmp.Canvas.Brush.Color:=clBlack;
FBmp.Canvas.FillRect(FBmp.Canvas.ClipRect);
FBmp.Canvas.Pen.Color:=clBlue;
FBmp.Canvas.Brush.Color:=clWhite;
FBmp.Canvas.Ellipse(0,0,20,20);
FBmp.Canvas.Ellipse(20,0,40,20);
FBmp.Canvas.Pen.Color:=clGreen;
FBmp.Canvas.Brush.Color:=clLime;
FBmp.Canvas.Polygon([Point(7,5),Point(14,10),Point(7,15)]);
FBmp.Canvas.Pen.Color:=clBlue;
FBmp.Canvas.Brush.Color:=clAqua;
FBmp.Canvas.Rectangle(25,5,29,15);
FBmp.Canvas.Rectangle(31,5,35,15);
Bmp1:=TBitmap.Create;
Bmp2:=TBitmap.Create;
SetBmp(FBmp);
end;
procedure TTwoStatusBut.Paint;
begin
If Status=0 then
Canvas.Draw(0,0,Bmp1)
Else If Status=1 then
Canvas.Draw(0,0,Bmp2);
inherited;
end;
procedure TTwoStatusBut.SetBmp(B: TBitmap);
Var
W2:Word;
begin
FBmp.Assign(B);
W2:=B.Width Div 2;
Width:=W2;
Height:=B.Height;
Bmp1.Width:=W2;
Bmp1.Height:=B.Height;
Bmp1.PixelFormat:=pf24Bit;
Bmp1.Transparent := True;
Bmp1.TransparentMode:= tmAuto;
Bmp2.Assign(Bmp1);
Bmp1.Canvas.CopyRect(Bmp1.Canvas.ClipRect
,B.Canvas,Rect(0,0,W2,B.Height));
Bmp2.Canvas.CopyRect(Bmp2.Canvas.ClipRect
,B.Canvas,Rect(W2,0,W2*2,B.Height));
Invalidate;
end;
در ابتدای پروسیجر SetBmp با SaveToFile بررسی کردم در زمان اجرا چیزی که به پراپرتی میده همون تصویر اولیه هستش نه بیت مپی که در زمان طراحی بهش مسیر دادم!