从改写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;

解决方案 »

  1.   

    TPanel有Canvas,在protected部分。所以你只要继承TPanel建一个新类就OK;
    TMyPanel := class(TPanel);
    var
    MyPanel :TMyPanel;
    Begin
      MyPanel.Canvas.
    end;
      

  2.   

    上面有点问题,应加上inherited Paint;
    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;
      

  3.   

    看看我的吧!
    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;
      

  4.   

    哈哈哈哈,是我错了。qiaoda_ly说得对,直接DragDrop就可以。
    是我理解错误,误认为在Panel中拖放对象,必须要靠Panel的OnDragOver / OnDragDrop 事件,
    实际上在Panel中放个TImage,即使将其Align设为alClient,只要响应Image的OnDragOver / OnDragDrop 事件,
    同样可以实现拖放。不用派生新类或作新组件。感谢各位!!!