从改写TPanel的paintunit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyPanel = class(TPanel)
procedure paint;override;
end;
var
Form1: TForm1;
APanel : TMyPanel;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
APanel :=TMyPanel.Create(Self);
APanel.Parent := Self;end;{ TMyPanle }procedure TMyPanel.paint;
var
ACanvas : TCanvas;
ABmp : Tbitmap;
begin
ACanvas := TCanvas.Create;
ABmp := Tbitmap.Create;
Abmp.LoadFromFile('d:\1.bmp');
ACanvas.Handle := GetDC(Self.Handle);
ACanvas.Draw(0 , 0 , Abmp);
ACanvas.Free;
Abmp.Free
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyPanel = class(TPanel)
procedure paint;override;
end;
var
Form1: TForm1;
APanel : TMyPanel;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
APanel :=TMyPanel.Create(Self);
APanel.Parent := Self;end;{ TMyPanle }procedure TMyPanel.paint;
var
ACanvas : TCanvas;
ABmp : Tbitmap;
begin
ACanvas := TCanvas.Create;
ABmp := Tbitmap.Create;
Abmp.LoadFromFile('d:\1.bmp');
ACanvas.Handle := GetDC(Self.Handle);
ACanvas.Draw(0 , 0 , Abmp);
ACanvas.Free;
Abmp.Free
end;
TMyPanel := class(TPanel);
var
MyPanel :TMyPanel;
Begin
MyPanel.Canvas.
end;
procedure TMyPanel.paint;
var
ACanvas : TCanvas;
ABmp : Tbitmap;
begin inherited Paint; ACanvas := TCanvas.Create;
ABmp := Tbitmap.Create;
Abmp.LoadFromFile('d:\1.bmp');
ACanvas.Handle := GetDC(Self.Handle);
ACanvas.Draw(0 , 0 , Abmp);
ACanvas.Free;
Abmp.Free
end;
TMyPanel=Class(TPanel)
Provide
FBmp:Tbitmap;
......//
protect
procedure DrawPanel(var Msg:TWMPAINT);Message WM_PAINT;
.......////
Public
construtor Create(AOwner:TComponent);override;
destructor Destroy;override;
procedure SetBmp(Val:TBitmap);
.................//
publish
property Bmp:TBitmap read Fbmp write SetBmp;
construcor TMyPanel.Create(AOwner:TComponent);
begin
Inherited Create(AOwner);
FBmp:=TBitmap.create;
end;
Destructor TMyPanel.Drstroy;
begin
FBmp.free;
inherited;
end;
procedure DrawPanel(VAR Msg:TWMPAINT);
VAR
Canvas:TControlCanvas;
ARect:TRect;
BEGIN
Canvass:=TControlCanvas.create;
try
Canvas.handle:=GetDC(Handle);
ARect:=ClientRect;//得到PANEL的区域
Daw(0,0,FBmp);//自己画吧
finally
ReleaseDC(Canvas.handle,Handle);
Canvas.free;
end;
END;
procedure TMyPanel.SetBmp(Val:TBitmap);//这个过程可能有问题.我随
//手写的.自己注意
begin
if FBmp<>Val then
FBmp:=Val;
FBmp.Assign(Val);
end;
是我理解错误,误认为在Panel中拖放对象,必须要靠Panel的OnDragOver / OnDragDrop 事件,
实际上在Panel中放个TImage,即使将其Align设为alClient,只要响应Image的OnDragOver / OnDragDrop 事件,
同样可以实现拖放。不用派生新类或作新组件。感谢各位!!!