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

原创 2002年03月13日 09:00:00

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

Delphi : 文件的拖放和打开,拖拽

user shellapi type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObj...
  • wozengcong
  • wozengcong
  • 2015年07月26日 01:54
  • 1370

Delphi拖放操作

今天明白了如何进行拖放操作(有赖于下面转载的文章)。而且进一步实验如何在cxgrid中拖放记录,其中有一个关键点就是目标对象的OnDragOver中写入Accept := (Source is Tcx...
  • yumenglong
  • yumenglong
  • 2009年08月01日 10:37
  • 2473

DELPHI中拖放的操作

拖放(DragDrop)是Windows提供的一种快捷的操作方式。作为基于Windows的开发工具,Delphi同样支持拖放操作,而且开发应用系统的拖放功能十分方便,真正体现了Delphi 的强大功能...
  • cureSHY
  • cureSHY
  • 2004年11月11日 16:34
  • 963

由双缓冲绘图技术谈起到Delphi源码实现

由双缓冲绘图技术谈起到Delphi源码实现(本文原创,转载请申明)xiaoyunsoft@163.com 摘要:双缓冲绘图技术在Delphi中的实现说明:假设读者熟悉VCL 双缓冲绘图也不是什么新技术...
  • sxy_9761
  • sxy_9761
  • 2006年03月08日 17:59
  • 4472

用Delphi实现热点

unit nRdUnit1;interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialog...
  • sunrise17
  • sunrise17
  • 2008年12月20日 12:59
  • 231

Delphi实现窗体总是向前操作,Delphi拖拽的一个例子

Delphi实现窗体总是向前操作,Delphi拖拽的一个例子
  • hellsb
  • hellsb
  • 2010年09月19日 02:30
  • 1167

Delphi使用文件拖放功能

1. 新建一个Delphi工程,将Form1的FormStyle属性设置为:fsStayOnTop,在窗体上放置一个Memo1控件,用于显示拖放进来的文件名; 2. 添加单元引用:ShellAP...
  • wozengcong
  • wozengcong
  • 2015年02月18日 00:21
  • 534

delphi 实现拖拽打开文件

步骤如下,delphi 7测试通过1、在uses 中增加 ShellAPI2、增加拖拽的消息处理函数  //声明  protected    procedure WMDROPFILES(var Msg...
  • webouse
  • webouse
  • 2008年09月22日 14:49
  • 4836

计算机科学与技术本科知识体系

整个计算机科学就像人一样,有两条腿。一条叫做数学(基础),一条叫做物理(基础)。数学主要指的是离散数学,其中比较重要的是逻辑和证明、Turing论题和Churcher论题。逻辑系统用逻辑的方法描述这个...
  • z09314211
  • z09314211
  • 2016年05月16日 23:59
  • 438

实现文件的拖放功能(Delphi)

unit uDropFile; { 这个小程序实现的内容是比较简单的,更有难度一些的,可以在RichEdit内部, 实现对选定文字的拖放=========================如何在Delp...
  • formiss
  • formiss
  • 2007年05月31日 17:01
  • 1833
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:专业拖放技术在CBuilder和Delphi下的实现
举报原因:
原因补充:

(最多只允许输入30个字)