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

    技术2022-05-11  174

    一. 重写控件的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)