分享
 
 
 

拖放功能的实现

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

最近编写了一个需要用到拖放功能的软件,之前本人对其还不神了解,找了网上的一些资料但多说的不是很直接。在这里说说我的心得。

以下所说的拖放功能是急于OLE的所以在程序的初始化中确认有如下的语句:

if (!AfxOleInit())

{

return FALSE;

}

这个原因费了我很多时间啊

拖放有一个源和一个目的,所以实现的时候需要有两个主要的类:源类COleDataSource、目的类COleDropTarget。

源的实现必须从COleDataSource类派生而来,由于源和目的必须有信息的传送。所以COleDataSource提供了几种信息传送方式,这里先介绍一种OnRenderFileData(LPFORMATETC lpFormatEtc,CFile* pFile),这个函数是从COleDataSource继承下来并实现的。以下是类的源码我的一个例子传送一个文本到目的控件

class CMyDataSource : public COleDataSource

{

protected:

// Attributes

public:

// Operations

public:

public:

CString m_strGifFullPath;

virtual ~CMyDataSource();

CMyDataSource();

// Generated message map functions

protected:

virtual BOOL OnRenderFileData(LPFORMATETC,CFile*);

};

BOOL CMyDataSource::OnRenderFileData(LPFORMATETC lpFormatEtc,CFile* pFile)

{

if(lpFormatEtc->cfFormat==CF_TEXT)

{

CArchive ar(pFile, CArchive::store);

ar.WriteString(m_strGifFullPath);

ar << (BYTE)'\0'; //注意试图不要关闭ar和pFile否则目的控件就不能接受到信息

return TRUE;

}

COleDataSource::OnRenderFileData(lpFormatEtc,pFile);

return FALSE;

}

启动拖放功能,我是从ListCtrl中拖出来的所以在OnBegindragFileList事件中写代码的 , 当然也可以在其他事件中启动,如左键按下。代码如下

CMyDataSource ItemDragDrop;

ItemDragDrop.DelayRenderFileData(CF_TEXT,NULL);//执行OnRenderFileData来获取数据

ItemDragDrop.m_strGifFullPath ="要传送的内容";

int iRes = ItemDragDrop.DoDragDrop();//直到左键弹起才返回

switch(iRes)

{//完成拖放后的处理

case DROPEFFECT_MOVE:

break;

case DROPEFFECT_COPY:

break;

case DROPEFFECT_NONE:

default:

break;

}

目的接收功能实现考COleDropTarget类完成的,添加一个成员到你的视图类中如COleDropTarget m_oleDropTarget;,并在视图类的OncCreate函数中注册该成员m_oleDropTarget.Register(this);工作完成一般,下面就是具体的接收代码了。

在视图类中有下面几个虚函数需要重写(很多文章中说消息,搞不懂),

OnDrop最后放下时调用

OnDragOver在视图上时调用

OnDragEnter鼠标刚进入视图时调用

OnDragLeave鼠标离开视图时调用

下面代码主要修改OnDrop和OnDragOver函数

全部使用默认的代码是不是OnDrop怎么都不调用啊 ,呵呵我也搞了很久才懂啊

因为默认代码OnDragOver返回值是DROPEFFECT_NONE所以OnDrop就不发生了,因此必须重写函数返并返回非DROPEFFECT_NONE值,简单一点就 return DROPEFFECT_COPY;好了。这时就断点调试停下了吧。没停下我也不懂了。

OndDrop函数的代码如下

if(pDataObject->IsDataAvailable(CF_TEXT))

{

CFile *pFile = pDataObject->GetFileData(CF_TEXT); //这个时候就会去调用源的OnRenderFileData函数了

CArchive ar(pFile, CArchive::load);

CString str;

ar.ReadString(str);

ar.Close();//

delete pFile;//记得关闭和析构哦,否则就内存泄漏咯

}

return TRUE;//默认的return 不要也可以反正是执行空函数,不信就跟进去看看吧

好了这样一个拖放的过程就完成了,在读的地方设置个断点看看数据是不是传送过来了啊,有的话就恭喜恭喜了,没有就从新检查一遍吧

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有