• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > AboutOLE,DragandDrop

AboutOLE,DragandDrop

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了draganddrop等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: About OLE, Drag and Drop
描述:

我想实现类似WinRAR中将目录/文件拖拽出来的功能,实现方法如下:
(1) 继承了MFC的COleDropSource,并实现了其中的QueryContinueDrag(...)接口,
    用来设置Drop标志(鼠标左键释放)。
(2) 继承了MFC的COleDataSource,并实现了其中的OnRenderGlobalData(...)接口,
    用来延迟提供数据。
(3) 调用pcDataSource->DelayRenderData(CF_HDROP),设置数据格式。
(4) 调用pcDataSource->DoDragDrop(...),开始DragDrop。
(5) 在pcDropSource->QueryContinueDrag(...)返回DRAGDROP_S_DROP后,
    在pcDataSource->OnRenderGlobalData(...)中提供实际数据。
我发现pcDataSource->OnRenderGlobalData(...)接口会被系统频繁调用,即使是在
我设置了Drop标志后,仍然会调用多次。而且好像并不是每次都需要将实际数据填
好,由于每次调用时传递的参数都一样,无法判断出哪一次才是真正要数据。在我的
系统上,我只要在第8次调用时将数据填好就行,可是在别的系统上却不对(不同的系
统次数不一样)。由于我的数据量有时会很大,不可能每次调用都提供实际数据。
请教:延迟提供数据的正确方法。谢谢!


解决方案1:

用下面的代码:
void onbegindrag(...)
{
HGLOBAL hGblFiles;
COleDataSource datasource;
hGblFiles=MakeHDragFilesData();
FORMATETC etc = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
datasource.CacheGlobalData( CF_FAVSOFTDRAGDATA, hGblFiles,&etc );
DROPEFFECT dropEff=datasource.DoDragDrop(DROPEFFECT_COPY ,NULL,NULL);
GlobalFree(hGblFiles);
}
HGLOBAL CSciView::MakeHDragFilesData()
{
HGLOBAL hGblFiles=NULL;
POSITION pos = m_filelstCtrl.GetFirstSelectedItemPosition();
CStringArray files;
int nFileListBufLen=0;
CString cdrompath=GetDocument()->m_CDROMPath;
while (pos)
{
int nItem = m_filelstCtrl.GetNextSelectedItem(pos);
CString   filename=cdrompath+m_strPath+m_filelstCtrl.GetItemText(nItem,0);
files.Add(filename);
nFileListBufLen+=filename.GetLength()+1;
}
nFileListBufLen++;
hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, sizeof(DROPFILES)+nFileListBufLen);
BYTE *szData=(BYTE*)GlobalLock(hGblFiles);
DROPFILES *pDropFiles=(DROPFILES*)szData;
pDropFiles->pFiles =sizeof(DROPFILES);
pDropFiles->pt.x=0;
pDropFiles->pt.y=0;
pDropFiles->fNC =FALSE;
pDropFiles->fWide =FALSE;
int offset=sizeof(DROPFILES);
for(int i=0;i<files.GetSize();i++)
{
CString filename=files.GetAt(i);
memcpy(szData+offset,(LPCTSTR)filename,filename.GetLength());
offset+=filename.GetLength()+1;
}
GlobalUnlock(hGblFiles);
return hGblFiles;
}

解决方案2:

把你的OnRenderGlobalData paste出来,
我瞧瞧


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-06-05 一个比较经典的同步问题,请大家帮忙!!
  • 2017-06-05 关于DLL的一个奇怪现象
  • 2017-06-04 数字签名怎么实现???
  • 2017-06-04 高分求教:VC制作的OCX控件无法在VB中调用的问题,错误码80004002
  • 2017-06-05 CString类的多线程问题
  • 2017-06-04 vc++中的invalidate方法与MFC中Activex的OnDraw虚函数
  • 2017-06-05 vc能否调用c#编写的DLL???
  • 2017-06-05 WaitForMultipleObjects等待多个事件的时候,如果同时有多于一个事件被触发,该如何处理所有事件呢?
  • 2017-06-05 远程线程注入
  • 2017-06-04 在控件里面设置快捷键~~!

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 比较弱质的问题?希望大家帮忙,不胜感激涕零
    • 如何把MFC程序和dos程序做到一起?
    • 如何在VC6中为控件增加事件?如何在VC7中为控件增加属性?
    • 如何调试dll?
    • 这个问题高人请点拨一下吧
    • 登陆网页后获取不到新网页的文档接口
    • 竟然在执行dll后报这样的错
    • DLL中加载MSCOMM32OCV的问题
    • 两位斑竹进来看看,这里有一个兄弟的问题,我加不了分,请两位来看看
    • 有人知道,纵横HTTP文件上传组件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有