سلام
من سابقا یه کامپوننت دکمه داشتم که در لنتساب بیت مپ به پراپرتی اون مشکل داشتم
جناب آقای شاهین عشایری راهنمایی فرمودند مشکل حل شد.
الآن دارم روی یه کامپوننت شبیه CheckBox کار می کنم.
باز همون مشکل رو دارم تقریبا از همون روشی که ایشون فرمودند پیش رفتم اما هنوز بیت مپ تعریف شده رو در زمان اجرا اعمال نمی کنه و تنها در زمان طراحی از بیت مپ تعریف شده توسط کاربر در Paint استفاده می کنه. لطفا این کد رو ملاحظه برفرمایید و بفرمایید چه کار کنم؟

unit TestCheckUnit;

interface

uses
Windows, Messages, SysUtils, Classes
,Forms,Controls, StdCtrls,Graphics,Math,dialogs,ExtCtrls,GraphUtil;
type
TTestCheck= class(TGraphicControl)
Private
BmpsInitialized:Boolean;
FBmp: TBitmap;
FShapeBmp,FTickBmp : TBitmap;
BitmapChanged:Boolean;
FChecked: Boolean;
procedure SetBmp(const B:TBitmap);
procedure InitializeBmps;
procedure SplitBitmap;
procedure SetChecked(const Value: Boolean);
procedure Click; override;
protected
procedure WMEnabled(var Message: TMessage); message WM_ENABLE;
public
constructor Create(AOwner: TComponent);Override;
procedure Paint;OverRide;
Published
Property Checked:Boolean read FChecked write SetChecked default True;
property Bmp:TBitmap read FBmp write SetBmp;
property OnClick;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Test', [TTestCheck]);
end;

procedure DrawTick(Can:TCanvas;CenterX,CenterY:Integer;XY:Ar ray Of Integer;C:TColor);
Var
I:SmallInt;
FillC:TColor;
begin
Can.Pen.Color:=C;
Can.MoveTo(CenterX+7,CenterY-7);
For I:=0 To High(XY) Div 2 Do
Can.LineTo(Can.PenPos.X+XY[I*2]
,Can.PenPos.Y+XY[I*2+1]);
//ÑÓã ÂÎÑíä äÞØå
Can.Pixels[Can.PenPos.X,Can.PenPos.Y]:=C;
FillC:=clLime;
Can.Pixels[Can.PenPos.X-3,Can.PenPos.Y+2]:=
FillC;
Can.Brush.Color:=FillC;
Can.FloodFill(Can.PenPos.X-10
,Can.PenPos.Y+10,C,fsBorder);
end;
{ TClrCheck }

constructor TTestCheck.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
SetParent(TWinControl(AOwner));
BmpsInitialized:=False;
FBmp:=TBitmap.Create;
FShapeBmp:=TBitmap.Create;
FTickBmp:=TBitmap.Create;
Checked:=True;
end;
procedure TTestCheck.InitializeBmps;
begin
FShapeBmp.PixelFormat:=pf24Bit;
FShapeBmp.Width:=25;
FShapeBmp.Height:=25;
FTickBmp.Assign(FShapeBmp);
FShapeBmp.Transparent:=true;
FTickBmp.Transparent:=true;
FShapeBmp.Canvas.Brush.Color:=clYellow;
FShapeBmp.Canvas.Rectangle(0,2,16,18);
DrawTick(FTickBmp.Canvas,10,7,[-4,2,-5,5,-3,0,-2,-1,0,3
,3,4,2,0,2,-2,4,-9,1,0,1,-1],clGreen);
BmpsInitialized:=True;
FBmp.Width:=50;
FBmp.Height:=25;
FBmp.Canvas.CopyRect(Rect(0,0,25,25),FShapeBmp.Can vas,FShapeBmp.Canvas.ClipRect);
FBmp.Canvas.CopyRect(Rect(25,0,50,25),FTickBmp.Can vas,FTickBmp.Canvas.ClipRect);
end;
procedure TTestCheck.Paint;
Var
R:TRect;
L:Integer;
begin
inherited;
If (BmpsInitialized=False)
Or (FBmp.Width=0) then
InitializeBmps
Else If BitmapChanged=True then
begin
SplitBitmap;
BitmapChanged := False;
end;
L:=Width-FTickBmp.Width-1;
Canvas.Draw(0,0,FShapeBmp);
If Checked=True then
Canvas.Draw(0,0,FTickBmp);
end;

procedure TTestCheck.SetBmp(const B: TBitmap);
begin
FBmp.Assign(B);
FBmp.PixelFormat:=pf24Bit;
BitmapChanged := True;
Invalidate;
end;
procedure TTestCheck.SplitBitmap();
Var
W2:Word;
H :HRGN;
begin
W2:=FBmp.Width Div 2;
Width:=W2;
Height:=FBmp.Height;
FShapeBmp.Width:=W2;
FShapeBmp.Height:=FBmp.Height;
FShapeBmp.PixelFormat:=pf24Bit;
FShapeBmp.Transparent := True;
FShapeBmp.TransparentMode:= tmAuto;
FTickBmp.Assign(FShapeBmp);
FShapeBmp.Canvas.CopyRect(FShapeBmp.Canvas.ClipRec t
,FBmp.Canvas,Rect(0,0,W2,FBmp.Height));
FTickBmp.Canvas.CopyRect(FTickBmp.Canvas.ClipRect
,FBmp.Canvas,Rect(W2,0,W2*2,FBmp.Height));
Invalidate;
end;
procedure TTestCheck.WMEnabled(var Message: TMessage);
begin
Invalidate;
end;
procedure TTestCheck.SetChecked(const Value: Boolean);
begin
FChecked := Value;
Invalidate;
end;
procedure TTestCheck.Click;
begin
inherited;
If Checked=True then
Checked:=False
Else
Checked:=True;
end;

end.