如何将程序中的内容“拖”到桌面或文件夹中(DoDragDrop高难度高分问题)

chenybin 2007-01-30 11:30:22
实现拖出,

现在程序的“拖”数据源是Listview,具体的内容根据Listview选中的文件从ftp下载(这个无所谓,反正从其他地方来的,数据库的stream等等都可以,不同于普通文本拖放),希望拖放完毕,鼠标放开以后开始下载ftp的内容,并保存到本地,

(从程序窗口中的listview拖到桌面等地方)

...全文
1146 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
freethy 2009-08-25
  • 打赏
  • 举报
回复
呼呼
这么多兄弟这么早都讨论过该问题了咯。。。。
我今天还刚刚用到
楼主 解决了没?
chenybin 2008-03-06
  • 打赏
  • 举报
回复
继续迷茫中,主要还是想在Delphi中实现
chenybin 2007-10-16
  • 打赏
  • 举报
回复
to codewarrior :
非常感谢,这些文章已经看了很多次了,拖出去内容,如果本地不存在,确实有那么点难度,如果能借鉴rar的方式也可以,不过现在没搞定
chenybin 2007-10-16
  • 打赏
  • 举报
回复
用SetCapture好像比较复杂吧
Lord Li 2007-10-16
  • 打赏
  • 举报
回复
群上来接分的。
会思考的草 2007-07-31
  • 打赏
  • 举报
回复
看我的blog吧,这个拖放很容易的。
http://blog.csdn.net/codewarrior/archive/2004/06/15/12039.aspx
http://blog.csdn.net/codewarrior/archive/2004/06/15/12040.aspx
http://blog.csdn.net/codewarrior/archive/2004/06/15/12041.aspx
mynamelj 2007-07-31
  • 打赏
  • 举报
回复
自已处理吧,用SetCapture,然后用WindowFromPoint判断是桌面还是文件夹,再获取路径
littlegang 2007-07-31
  • 打赏
  • 举报
回复
TO chenybin

COleDataSource 有延迟的方法,在codeproject有示例代码
==================
指哪个链接?你看的是
http://www.codeproject.com/shell/dropsourcehelpermfc.asp ?
sxcong 2007-07-31
  • 打赏
  • 举报
回复
不能用API,那样整个系统都被占用了,其他什么都干不成.
wshcdr 2007-07-28
  • 打赏
  • 举报
回复

谢谢楼上的兄弟
COleDataSource 有延迟的方法,在codeproject有示例代码,但是现在要在其他语言,比如delphi和vb里面实现,所以最好用api的方式,没看懂mfc的原理,谢谢


//////////////////////
用VC做COM dll
在Delphi或者VB中调用这个dll好了
chenybin 2007-06-23
  • 打赏
  • 举报
回复
没有解决,郁闷了
whiteclouds 2007-06-13
  • 打赏
  • 举报
回复
楼主,问题解决没有?我也正在做这方面东西,交流一下?
chenybin 2007-03-28
  • 打赏
  • 举报
回复
没找到,看了大半天了
kimryo 2007-03-28
  • 打赏
  • 举报
回复
改成用API应该不难吧,把MFC类的方法改成API调用就行了~。。。
chenybin 2007-03-28
  • 打赏
  • 举报
回复
谢谢楼上的兄弟
COleDataSource 有延迟的方法,在codeproject有示例代码,但是现在要在其他语言,比如delphi和vb里面实现,所以最好用api的方式,没看懂mfc的原理,谢谢
kimryo 2007-03-25
  • 打赏
  • 举报
回复
COleDataSource m_DragSource;
kimryo 2007-03-25
  • 打赏
  • 举报
回复
void CFileListCtrl::OnDrop(COleDataObject *pDataObj,BOOL* pbRet)
{
CWaitCursor Cursor;
CWnd* pWnd=GetParent();
if(pWnd==NULL)
return;
pWnd->KillTimer(2);
*pbRet=FALSE;
SetMiscFlag(MISC_DRAGGING,FALSE);
if(ReadMiscFlag(MISC_SELFDRAG)&&GetSelectedCount()==0){
SetMiscFlag(MISC_SELFDRAG,FALSE);
return;
}
SetMiscFlag(MISC_SELFDRAG,FALSE);

if(m_pidlfItem==NULL)
return;

TCHAR szDst[MAX_PATH],szCurAddr[MAX_PATH];
SHGetPathFromIDList(m_pidlfItem,szCurAddr);
if(GetSelectedCount()==1)
GetSelItemPath(szDst);
else
_tcscpy(szDst,szCurAddr);
CStringArray FileArray;
FileArray.RemoveAll();
BOOL bMove=IsStatekeyPressed(VK_SHIFT),bCtrl=IsStatekeyPressed(VK_CONTROL);

CMyOleDragDrop::GetFileData(pDataObj,FileArray);
if(bMove&&bCtrl){
for(int i=0;i<FileArray.GetSize();i++)
AddFileLinkItem(FileArray.GetAt(i),szDst,szCurAddr);
}else{
if(FileArray.GetSize()>0)
CopyFileItem(FileArray,szDst,szCurAddr,bMove);
}
FileArray.RemoveAll();
*pbRet=TRUE;
}
kimryo 2007-03-25
  • 打赏
  • 举报
回复
void CFileListCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
*pResult = 0;

if(GetSelectedCount()>0){
int iSels=GetSelectedCount(),iLen;
LPTSTR pszFiles=new TCHAR[MAX_PATH*iSels];
if(pszFiles==NULL)
return;
GetSelItemPaths(pszFiles,&iLen);

DROPFILES df;
ZeroMemory(&df,sizeof(DROPFILES));
df.fWide=FALSE;
df.pFiles=sizeof(DROPFILES);

HGLOBAL hGlobal=GlobalAlloc(GMEM_FIXED,iLen+sizeof(DROPFILES));
memcpy(hGlobal,&df,sizeof(DROPFILES));
memcpy(((LPBYTE)hGlobal+sizeof(DROPFILES)),pszFiles,iLen);
delete[] pszFiles;

m_DragSource.CacheGlobalData(CF_HDROP,hGlobal);
SetMiscFlag(MISC_SELFDRAG);
SetMiscFlag(MISC_DRAGGING);
DROPEFFECT rdf=m_DragSource.DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_MOVE|DROPEFFECT_LINK|DROPEFFECT_SCROLL);
CheckSelAvailable();
m_DragSource.Empty();
SetMiscFlag(MISC_DRAGGING,FALSE);
}
*pResult = 1;
}
kimryo 2007-03-25
  • 打赏
  • 举报
回复
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
*pResult = 0;

if(GetSelectedCount()>0){
int iSels=GetSelectedCount(),iLen;
LPTSTR pszFiles=new TCHAR[MAX_PATH*iSels];
if(pszFiles==NULL)
return;
GetSelItemPaths(pszFiles,&iLen);

DROPFILES df;
ZeroMemory(&df,sizeof(DROPFILES));
df.fWide=FALSE;
df.pFiles=sizeof(DROPFILES);

HGLOBAL hGlobal=GlobalAlloc(GMEM_FIXED,iLen+sizeof(DROPFILES));
memcpy(hGlobal,&df,sizeof(DROPFILES));
memcpy(((LPBYTE)hGlobal+sizeof(DROPFILES)),pszFiles,iLen);
delete[] pszFiles;

m_DragSource.CacheGlobalData(CF_HDROP,hGlobal);
SetMiscFlag(MISC_SELFDRAG);
SetMiscFlag(MISC_DRAGGING);
DROPEFFECT rdf=m_DragSource.DoDragDrop(DROPEFFECT_COPY|DROPEFFECT_MOVE|DROPEFFECT_LINK|DROPEFFECT_SCROLL);
CheckSelAvailable();
m_DragSource.Empty();
SetMiscFlag(MISC_DRAGGING,FALSE);
}
*pResult = 1;
littlegang 2007-03-25
  • 打赏
  • 举报
回复
winrar 可能是先建立临时文件夹,
那么拖放时可以提供一个对应的文件名
加载更多回复(22)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧