专业拖放技术在CBuilder和Delphi下的实现

一. 重写控件的GetDragImages方法.

实现步骤:1.重写控件的GetDragImages方法

class TMyPanel:public TPanel{
private:
TDragImageList*dragimgs;
protected:
   virtual TDragImageList* __fastcall GetDragImages(void)
   {
       Graphics::TBitmap*bmp=new Graphics::TBitmap();
       bmp->Width=Width;
       bmp->Height=Height;
       PaintTo(bmp->Canvas->Handle,0,0);
       dragimgs->Width=Width;
       dragimgs->Height=Height;
       dragimgs->Add(bmp,NULL);
       return dragimgs;
   }
public:
  __fastcall TMyPanel(TComponent*AOwner)
  :TPanel(AOwner){
    Width=300;Height=200;
    DragMode=dmAutomatic;//设置自动拖放
    ControlStyle<< csDisplayDragImage;
    dragimgs=NULL;
    Font->Color=clRed;
    Caption="Hello This is a test of Control Drag";
    dragimgs=new TDragImageList(this);
  }

2.对使用该控件的窗体添加以下方法,并在窗体建立时调用FixCSStyle(this)使窗体里的所有控件都可以显示拖放图形

void FixCSStyle(TComponent*fc)//使所有控件都可以显示拖放图形

{   for(int i=0;i<fc->ComponentCount;i++)
   {
     TComponent*c=fc->Components[i];
     if(c->InheritsFrom(__classid(TControl)))
       ((TControl*)c)->ControlStyle<< csDisplayDragImage;

    if(c->ComponentCount>0)FixCSStyle(c);
   }

};

方法二.不重写控件,使用TDragControlObject的派生类实现.本人以文本对象的拖放为例

步骤:1.实现TDragControlObject的派生类

class TTextDragObject:public TDragControlObject
{
private:
  TDragImageList*dragImgs;
  AnsiString FDragText;
protected:
  virtual TDragImageList* __fastcall GetDragImages(void){

  if(dragImgs==NULL)
     dragImgs=new TDragImageList(NULL);
   Graphics::TBitmap*bmp=new Graphics::TBitmap();bmp->Height=bmp->Canvas-.TextHeight(FDragText);bmp->Width=bmp->Canvas->TextWidth(FDragText);

bmp->Canvas->TextOut(0,0,FDragText);

    dragImgs->Width=bmp->Width;
    dragImgs->Height=bmp->Height;
int    idx=dragImgs->AddMasked(bmp,clWhite);

dragImgs->SetDragImage(idx,0,0);

};
public:
  __fastcall TTextDragObject(TControl*AControl,AnsiString text);
  __fastcall virtual ~TTextDragObject(void);
  __property AnsiString DragText={read=FDragText,write=FDragText};
};

 

2.在拖放源控件的OnStartDrag事件中加上如下一句
void __fastcall TForm1::Panel1StartDrag(TObject *Sender,
      TDragObject *&DragObject)
{
    DragObject=new TTextDragObject(Panel1,"Drag Text test");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值