当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++ Builder教程

专业拖放技术在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\");
}

相关内容
赞助商链接