为啥设计时加载图片(Picture属性)会出错
为什么设计时加载图片(Picture属性)会出错?
unit Button1;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Messages, Windows, Graphics;
type
TBorderStyle = (bsNone, bsSolid);
TButton1 = class(TButton)
private
{ Private declarations }
FBorderStyle : TBorderStyle;
FIsFocused : Boolean;
FPicture : TPicture;
FUsePictureSize : Boolean;
procedure SetBorderStyle(const Value: TBorderStyle);
procedure PictureChange(Sender : TObject);
procedure SetUsePictureSize(const Value: Boolean);
protected
{ Protected declarations }
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP;
procedure DrawItem(DrawItemStruct: TDrawItemStruct);
procedure CreateParams(var Params: TCreateParams); override;
procedure CNMeasueItem(var message : TWMMeasureItem); message CN_MEASUREITEM;
procedure CNDrawItem(var message : TWMDrawItem); message CN_DRAWITEM;
procedure SetButtonStyle(ADefault: Boolean); override;
public
{ Public declarations }
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property BorderStyle : TBorderStyle read FBorderStyle write SetBorderStyle;
property Picture : TPicture read FPicture;
property UsePictureSize : Boolean read FUsePictureSize write SetUsePictureSize;
end;
procedure Register;
implementation
uses Dialogs;
procedure Register;
begin
RegisterComponents('Lot LC', [TButton1]);
end;
{ TButton1 }
procedure TButton1.CNDrawItem(var message: TWMDrawItem);
begin
if not(csDestroying in ComponentState) then
DrawItem(Message.DrawItemStruct^);
end;
procedure TButton1.CNMeasueItem(var message: TWMMeasureItem);
var
temp : TMeasureItemStruct;
begin
temp := message.MeasureItemStruct^;
temp.itemWidth := Width;
temp.itemHeight := Height;
message.MeasureItemStruct^ := temp;
end;
constructor TButton1.Create(AOwner: TComponent);
begin
inherited;
FIsFocused := False;
FBorderStyle := bsSolid;
FPicture := TPicture.Create;
//FPicture.OnChange := PictureChange;
end;
procedure TButton1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or BS_OWNERDRAW;
end;
destructor TButton1.Destroy;
begin
FPicture.Free;
inherited;
end;
procedure TButton1.DrawItem(DrawItemStruct: TDrawItemStruct);
var
hDC : THandle;
Canvas : TCanvas;
Rect : TRect;
begin
hDC := DrawItemStruct.hDC;
Canvas := TCanvas.Create;
try
Canvas.Handle := hDC;
Rect := ClientRect;
if FBorderStyle = bsSolid then Canvas.Rectangle(Rect);
if Assigned(FPicture.Graphic) and not FPicture.Graphic.Empty then
begin
if FIsFocused then Canvas.Draw(2, 2 , FPicture.Graphic)
else Canvas.Draw(0, 0, FPicture.Graphic);
//BitBlt(hDC, 2, 2, Width - 2, Height - 2, FPicture.Graphic, 0, 0 , SRCCOPY);
end;
if FIsFocused then
begin
InflateRect(Rect, -3 , -3);
Canvas.DrawFocusRect(Rect);
end;
unit Button1;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Messages, Windows, Graphics;
type
TBorderStyle = (bsNone, bsSolid);
TButton1 = class(TButton)
private
{ Private declarations }
FBorderStyle : TBorderStyle;
FIsFocused : Boolean;
FPicture : TPicture;
FUsePictureSize : Boolean;
procedure SetBorderStyle(const Value: TBorderStyle);
procedure PictureChange(Sender : TObject);
procedure SetUsePictureSize(const Value: Boolean);
protected
{ Protected declarations }
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP;
procedure DrawItem(DrawItemStruct: TDrawItemStruct);
procedure CreateParams(var Params: TCreateParams); override;
procedure CNMeasueItem(var message : TWMMeasureItem); message CN_MEASUREITEM;
procedure CNDrawItem(var message : TWMDrawItem); message CN_DRAWITEM;
procedure SetButtonStyle(ADefault: Boolean); override;
public
{ Public declarations }
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property BorderStyle : TBorderStyle read FBorderStyle write SetBorderStyle;
property Picture : TPicture read FPicture;
property UsePictureSize : Boolean read FUsePictureSize write SetUsePictureSize;
end;
procedure Register;
implementation
uses Dialogs;
procedure Register;
begin
RegisterComponents('Lot LC', [TButton1]);
end;
{ TButton1 }
procedure TButton1.CNDrawItem(var message: TWMDrawItem);
begin
if not(csDestroying in ComponentState) then
DrawItem(Message.DrawItemStruct^);
end;
procedure TButton1.CNMeasueItem(var message: TWMMeasureItem);
var
temp : TMeasureItemStruct;
begin
temp := message.MeasureItemStruct^;
temp.itemWidth := Width;
temp.itemHeight := Height;
message.MeasureItemStruct^ := temp;
end;
constructor TButton1.Create(AOwner: TComponent);
begin
inherited;
FIsFocused := False;
FBorderStyle := bsSolid;
FPicture := TPicture.Create;
//FPicture.OnChange := PictureChange;
end;
procedure TButton1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or BS_OWNERDRAW;
end;
destructor TButton1.Destroy;
begin
FPicture.Free;
inherited;
end;
procedure TButton1.DrawItem(DrawItemStruct: TDrawItemStruct);
var
hDC : THandle;
Canvas : TCanvas;
Rect : TRect;
begin
hDC := DrawItemStruct.hDC;
Canvas := TCanvas.Create;
try
Canvas.Handle := hDC;
Rect := ClientRect;
if FBorderStyle = bsSolid then Canvas.Rectangle(Rect);
if Assigned(FPicture.Graphic) and not FPicture.Graphic.Empty then
begin
if FIsFocused then Canvas.Draw(2, 2 , FPicture.Graphic)
else Canvas.Draw(0, 0, FPicture.Graphic);
//BitBlt(hDC, 2, 2, Width - 2, Height - 2, FPicture.Graphic, 0, 0 , SRCCOPY);
end;
if FIsFocused then
begin
InflateRect(Rect, -3 , -3);
Canvas.DrawFocusRect(Rect);
end;