再开一贴,还是剪切的问题,大版主们,各位大侠们,救命啊 见http://community.csdn.net/Expert/topic/3070/3070994.xml?temp=.396908 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题内容我有一个ListView,显示了N多同一文件夹中的文件,我想实现与资源管理器之间的剪贴板交互。目前复制和粘贴都实现了,请问怎么实现剪切功能,也就是在ListView中剪切一个文件,也可以在资源管理器中粘贴,粘贴完成后,将该文件删除? 文件刪除可以直接用 kill 命令啊!也可以用filesystemobject. 回楼上,如果只是在自己的程序中运行剪切,那还挺好办。我只是想在Explore与自己写的程序中进行剪切交互,即在自己写的ListView中剪切一个文件或文件夹,然后再到Explore中进行粘贴,粘贴完成后删除文件夹,So..................没招了 可以考虑通过IContextMenu中的Invoke方法调用系统的cut方法。 回楼上:本来是想通过IContextMenu的,但是我显示的菜单是ActiveBar的,怎么样才能使我写一个方法调用系统的Cut方法呢?我这里有一段VC的代码,请帮我看看VOID CutOrCopyFiles(char *lpBuffer,UINT uBufLen,BOOL bCopy){ UINT uDropEffect; DROPFILES dropFiles; UINT uGblLen,uDropFilesLen; HGLOBAL hGblFiles,hGblEffect; char *szData,*szFileList; DWORD *dwDropEffect; uDropEffect=RegisterClipboardFormat("Preferred DropEffect"); hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD)); dwDropEffect=(DWORD*)GlobalLock(hGblEffect); if(bCopy) *dwDropEffect=DROPEFFECT_COPY; else *dwDropEffect=DROPEFFECT_MOVE; GlobalUnlock(hGblEffect); uDropFilesLen=sizeof(DROPFILES); dropFiles.pFiles =uDropFilesLen; dropFiles.pt.x=0; dropFiles.pt.y=0; dropFiles.fNC =FALSE; dropFiles.fWide =TRUE; uGblLen=uDropFilesLen+uBufLen*2+8; hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen); szData=(char*)GlobalLock(hGblFiles); memcpy(szData,(LPVOID)(&dropFiles),uDropFilesLen); szFileList=szData+uDropFilesLen; MultiByteToWideChar(CP_ACP,MB_COMPOSITE, lpBuffer,uBufLen,(WCHAR *)szFileList,uBufLen); GlobalUnlock(hGblFiles); if( OpenClipboard(NULL) ) { EmptyClipboard(); SetClipboardData( CF_HDROP, hGblFiles ); SetClipboardData(uDropEffect,hGblEffect); CloseClipboard(); }} 实现:case IDC_CUT :case IDC_COPY :memset(szBuffer,0,4096*sizeof(TCHAR));GetWindowText(GetDlgItem(hWnd,IDC_FILES),szBuffer,4096);if(*szBuffer!=0) { //把文本筐中的文件名整理成要求的格式:"file1\0File2\0" memset(szFiles,0,4096*sizeof(TCHAR)); lpFileStart=szFiles; //下个文件名存放位置指针 lpStart=szBuffer; //当前正在整理的文件名首地址 lp=szBuffer; while(*lp!=0) { if(*lp=='\r') { //到达文件名末尾 *lp=0; //将回车符号换成0 lstrcat(lpFileStart,lpStart); uLen=lstrlen(lpStart)+1; lpFileStart+=uLen; uTotalLen+=uLen; lp++;//跳过'\n' lpStart=lp+1; } lp++; } //Cut/Copy File if(LOWORD(wParam)==IDC_COPY) CutOrCopyFiles(szFiles,uTotalLen,TRUE); else CutOrCopyFiles(szFiles,uTotalLen,FALSE);}break;我已测试过,测试通过了,但就是不知道怎么改成VB的代码,按模画样,结果引起我的系统剪切版出问题了。谢谢 可以有你的e-mail吗?发短信息给我也行。我正在帮你写一个例子程序,不过现在要睡觉了,明天可以发给你。技术信息暂时保密! :) James0001(See-Plus-Plus)已将我的邮件地址发送到信息中,请查收,谢谢 呵呵,这个,非常好实现,你剪切的时候,得到的是一个Path不就完了嘛,,不管是撤消剪切,还是进行剪切,都好办呀, 已经实现,感谢James0001(See-Plus-Plus),结贴 access 升星了,散分... 如何在CHM文件中添加上下文ID 怎样在工具栏中的外接程序管理器中增加可用外接程序 几个文本框相关问题,望能指教 ADODC控件数据库开发!欢迎讨论!在线 关于Winsock的问题 如何在退出程序的时候询问是否退出,回答否就不退出? 奇怪的问题,无法得到菜单句柄~ 如何劫获出错信息? 怎样改变控件的形状和颜色??????!!!!!!??????????? 有小于等于三万条记录的数据库,不知道用access2000可以吗
{
UINT uDropEffect;
DROPFILES dropFiles;
UINT uGblLen,uDropFilesLen;
HGLOBAL hGblFiles,hGblEffect;
char *szData,*szFileList; DWORD *dwDropEffect; uDropEffect=RegisterClipboardFormat("Preferred DropEffect");
hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));
dwDropEffect=(DWORD*)GlobalLock(hGblEffect);
if(bCopy)
*dwDropEffect=DROPEFFECT_COPY;
else
*dwDropEffect=DROPEFFECT_MOVE;
GlobalUnlock(hGblEffect); uDropFilesLen=sizeof(DROPFILES);
dropFiles.pFiles =uDropFilesLen;
dropFiles.pt.x=0;
dropFiles.pt.y=0;
dropFiles.fNC =FALSE;
dropFiles.fWide =TRUE; uGblLen=uDropFilesLen+uBufLen*2+8;
hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen);
szData=(char*)GlobalLock(hGblFiles);
memcpy(szData,(LPVOID)(&dropFiles),uDropFilesLen);
szFileList=szData+uDropFilesLen; MultiByteToWideChar(CP_ACP,MB_COMPOSITE,
lpBuffer,uBufLen,(WCHAR *)szFileList,uBufLen);
GlobalUnlock(hGblFiles); if( OpenClipboard(NULL) )
{
EmptyClipboard();
SetClipboardData( CF_HDROP, hGblFiles );
SetClipboardData(uDropEffect,hGblEffect);
CloseClipboard();
}
}
case IDC_COPY :
memset(szBuffer,0,4096*sizeof(TCHAR));
GetWindowText(GetDlgItem(hWnd,IDC_FILES),szBuffer,4096);
if(*szBuffer!=0) {
//把文本筐中的文件名整理成要求的格式:"file1\0File2\0"
memset(szFiles,0,4096*sizeof(TCHAR));
lpFileStart=szFiles; //下个文件名存放位置指针
lpStart=szBuffer; //当前正在整理的文件名首地址
lp=szBuffer;
while(*lp!=0) {
if(*lp=='\r') { //到达文件名末尾
*lp=0; //将回车符号换成0
lstrcat(lpFileStart,lpStart);
uLen=lstrlen(lpStart)+1;
lpFileStart+=uLen;
uTotalLen+=uLen;
lp++;//跳过'\n'
lpStart=lp+1;
}
lp++;
}
//Cut/Copy File
if(LOWORD(wParam)==IDC_COPY)
CutOrCopyFiles(szFiles,uTotalLen,TRUE);
else CutOrCopyFiles(szFiles,uTotalLen,FALSE);
}
break;我已测试过,测试通过了,但就是不知道怎么改成VB的代码,按模画样,结果引起我的系统剪切版出问题了。谢谢
不过现在要睡觉了,明天可以发给你。技术信息暂时保密! :)