📄 sortlistctrl.cpp
字号:
//void CSortListCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
//{
// NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// // TODO: Add your control notification handler code here
// //确信要拖动,而不是随便点击
// //按下左键250ms则认为要拖动
// Sleep(250);
// MSG msg;
// ::PeekMessage(
// &msg,
// GetSafeHwnd(),
// WM_LBUTTONUP,
// WM_LBUTTONUP,
// PM_NOREMOVE
// );
// //随意点击而已,返回
// if( msg.message==WM_LBUTTONUP )
// return;
//
// DWORD Contens;
// Contens=(DWORD)this;
// HGLOBAL hData = GlobalAlloc(GHND|GMEM_SHARE,sizeof(DWORD) );
// char *pS = (char *)GlobalLock( hData );
// memcpy( pS, (char*)&Contens,sizeof(DWORD));
// GlobalUnlock( hData );
//
// m_bDraging = TRUE; //开始拖动
// COleDataSource source;
// source.CacheGlobalData( RegisterClipboardFormat("ListCtrl")/*CF_TEXT*/, hData );
// source.DoDragDrop( DROPEFFECT_COPY );
// GlobalFree( hData );
// m_bDraging = FALSE; //完成拖动
// *pResult = 0;
//}
DROPEFFECT CSortListCtrl::OnDragOver(WPARAM pDropInfoClass, LPARAM lParm)
{
COleDropInfo* pInfo = (COleDropInfo* )pDropInfoClass;
ASSERT(pInfo->IsKindOf(RUNTIME_CLASS(COleDropInfo)));
if( pInfo->m_pDataObject->IsDataAvailable(RegisterClipboardFormat("ListCtrl")) )
return DROPEFFECT_COPY;
else
return DROPEFFECT_NONE;
}
DROPEFFECT CSortListCtrl::OnDropEx(WPARAM pDropInfoClass, LPARAM lParm)
{
return (DROPEFFECT)-1;
}
BOOL CSortListCtrl::OnDrop(WPARAM pDropInfoClass, LPARAM lParm)
{
if(MessageBox( "确定要拷贝吗?","提示",MB_YESNO)!=IDYES)
return false;
COleDropInfo* pInfo = (COleDropInfo* )pDropInfoClass;
ASSERT(pInfo->IsKindOf(RUNTIME_CLASS(COleDropInfo)));
if( pInfo->m_pDataObject->IsDataAvailable(RegisterClipboardFormat("ListCtrl")) )
{
HGLOBAL hMem = pInfo->m_pDataObject->GetGlobalData(RegisterClipboardFormat("ListCtrl"));
char* lp = (char *)GlobalLock((HGLOBAL) hMem);//lock source
if (lp != NULL)
{
AfxGetApp()->DoWaitCursor(1);
//Set Windows title with Drop text
CString Mess;
DRAG mydrag=*(DRAG*)lp;
WSAEVENT hEvent=WSACreateEvent();
if(hEvent==WSA_INVALID_EVENT)
{
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
AfxGetApp()->DoWaitCursor(0);
return false;
}
SOCKET s;
if(!PeerCreateSocket(&s,PEER_STREAM))
{
Mess="创建套接字";
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
WSACloseEvent(hEvent);
AfxGetApp()->DoWaitCursor(0);
return false;
}
if(!PeerConnectSocket(s,ADDRESS,7788))
{
Mess="连接主机:";
Mess+=ADDRESS;
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
WSACloseEvent(hEvent);
closesocket(s);
AfxGetApp()->DoWaitCursor(0);
return false;
}
CString filename;
CString attrib;
if(mydrag.flag==0)
{
CPeerFileListView*lv=(CPeerFileListView*)mydrag.wnd;
if(&lv->list!=this)
{
///本地到远程
memset(&com,0,sizeof(com));
com.CommandID=PEER_FILE_SAVEFILE;
if(!PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hEvent))
{
Mess="发送UpLoad文件/文件夹命令";
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
AfxGetApp()->DoWaitCursor(0);
return false;
}
POSITION pos = lv->list.GetFirstSelectedItemPosition();
while (pos)
{
int nItem = lv->list.GetNextSelectedItem(pos);
filename=lv->list.GetItemText(nItem,0);
attrib=lv->list.GetItemText(nItem,1);
if(filename=="." || filename=="..")
continue;
if(attrib=="文件夹")
{
Mess="尚未提供文件夹操作功能";//"上传文件夹:\""+lv->path+"\\"+filename+"\"";
if(!SendDir(s,hEvent,lv->path,filename))
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
else
Message(Mess.GetBuffer(Mess.GetLength()),"成功");
MessageBox("尚未提供文件夹操作功能");
}
else
{
Mess="上传文件:\""+lv->path+"\\"+filename+"\"";
if(!SendFile(s,hEvent,lv->path,filename))
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
else
Message(Mess.GetBuffer(Mess.GetLength()),"成功");
}
}
CPeerFileRemoteListView* lrv=(CPeerFileRemoteListView*)GetParent();
lrv->Retrive();
}
}
else
{
CPeerFileRemoteListView*rv=(CPeerFileRemoteListView*)mydrag.wnd;
if(&rv->list!=this)
{
///远程到本地
memset(&com,0,sizeof(com));
com.CommandID=PEER_FILE_SENDFILE;
if(!PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hEvent))
{
Mess="发送DownLoad文件/文件夹命令";
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
AfxGetApp()->DoWaitCursor(0);
return false;
}
POSITION pos = rv->list.GetFirstSelectedItemPosition();
while (pos)
{
int nItem = rv->list.GetNextSelectedItem(pos);
filename=rv->list.GetItemText(nItem,0);
attrib=rv->list.GetItemText(nItem,1);
if(filename=="." || filename=="..")
continue;
if(attrib=="文件夹")
{
Mess="尚未提供文件夹操作功能";//"下载文件夹:\""+rv->path+"\\"+filename+"\"";
if(!RecvDir(s,hEvent,rv->path,filename))
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
else
Message(Mess.GetBuffer(Mess.GetLength()),"成功");
MessageBox("尚未提供文件夹操作功能");
}
else
{
Mess="下载文件:\""+rv->path+"\\"+filename+"\"";
if(!RecvFile(s,hEvent,rv->path,filename))
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
else
Message(Mess.GetBuffer(Mess.GetLength()),"成功");
}
}
CPeerFileListView* rlv=(CPeerFileListView*)GetParent();
rlv->Retrive();
}
}
WSACloseEvent(hEvent);
closesocket(s);
AfxGetApp()->DoWaitCursor(0);
}
GlobalUnlock( hMem );//unlock source
return TRUE;
}
else
return FALSE;
}
bool CSortListCtrl::SendFile(SOCKET s, WSAEVENT hEvent,CString path,CString filename)
{
CPeerFileRemoteListView*rv=(CPeerFileRemoteListView*)GetParent();
char buf[4096];
CString thispath=path+"\\"+filename;
CString thatpath=rv->path+"\\"+filename;
FILEINFO fi;
FILE *fp;
if(!(fp=fopen(thispath,"rb")))
return false;
strcpy(fi.filename,thatpath);
if(fseek(fp,0l,SEEK_END))
{
fclose(fp);
return false;
}
if((fi.filesize=ftell(fp))==-1)
{
fclose(fp);
return false;
}
if(fseek(fp,0l,SEEK_SET))
{
fclose(fp);
return false;
}
//////////////////////////////////////////////////////
if(!PeerSendDataS(s,(char*)&fi,sizeof(fi),&ret,hEvent))
{
fclose(fp);
return false;
}
DWORD fcount;
while((fcount=fread(buf,sizeof(char),4096,fp)))
{
if(!PeerSendDataS(s,buf,fcount,&ret,hEvent)||ret!=fcount)
{
fclose(fp);
return false;
}
}
fclose(fp);
////////////////////////////
return true;
}
bool CSortListCtrl::RecvFile(SOCKET s, WSAEVENT hEvent,CString path,CString filename)
{
CPeerFileRemoteListView*rv=(CPeerFileRemoteListView*)GetParent();
CString thispath=path+"\\"+filename;
CString thatpath=rv->path+"\\"+filename;
char buf[4096];
DWORD retLen;
FILEINFO fi;
strcpy(fi.filename,thispath);
if(!PeerSendDataS(s,(char*)&fi,sizeof(fi),&retLen,hEvent))
{
return false;
}
if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen,
hEvent)||retLen!=sizeof(fi))
return false;
FILE *fp;
if(!(fp=fopen(thatpath,"wb+")))
return false;
DWORD dwGetSize=0;
while(dwGetSize<fi.filesize)
{
if(fi.filesize-dwGetSize>4096)
{
if(!PeerRecvDataS(s,buf,4096,&retLen,
hEvent))
{
fclose(fp);
DeleteFile(fi.filename);
return false;
}
else
if(fwrite(buf,sizeof(char),4096,fp)!=4096)
{
fclose(fp);
DeleteFile(fi.filename);
return false;
}
else
dwGetSize+=4096;
}
else
{
if(!PeerRecvDataS(s,buf,fi.filesize-dwGetSize,&retLen,
hEvent))
{
fclose(fp);
DeleteFile(fi.filename);
return false;
}
else
if(fwrite(buf,sizeof(char),fi.filesize-dwGetSize,fp)!=fi.filesize-dwGetSize)
{
fclose(fp);
DeleteFile(fi.filename);
return false;
}
else
dwGetSize+=fi.filesize-dwGetSize;
}
}
fclose(fp);
return true;
}
bool CSortListCtrl::SendDir(SOCKET s, WSAEVENT hEvent,CString path,CString filename)
{
return true;
}
bool CSortListCtrl::RecvDir(SOCKET s, WSAEVENT hEvent,CString path,CString filename)
{
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -