📄 peerfileremotelistview.cpp
字号:
// PeerFileRemoteListView.cpp : implementation file
//
#include "stdafx.h"
#include "peeryouc.h"
#include "PeerFileRemoteListView.h"
#include "peersocket.h"
#include "command.h"
#include "createdirdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPeerFileRemoteListView
IMPLEMENT_DYNCREATE(CPeerFileRemoteListView, CView)
CPeerFileRemoteListView::CPeerFileRemoteListView()
{
}
CPeerFileRemoteListView::~CPeerFileRemoteListView()
{
}
BEGIN_MESSAGE_MAP(CPeerFileRemoteListView, CView)
//{{AFX_MSG_MAP(CPeerFileRemoteListView)
ON_WM_CREATE()
ON_COMMAND(ID_PEER_FILE_REMOTE_LIST, OnPeerFileRemoteList)
ON_COMMAND(ID_PEER_FILE_REOMTE_BIG, OnPeerFileReomteBig)
ON_COMMAND(ID_PEER_FILE_REOMTE_REPORT, OnPeerFileReomteReport)
ON_COMMAND(ID_PEER_FILE_REOMTE_SMAll, OnPEERFILEREOMTESMAll)
ON_WM_SIZE()
ON_CBN_SELENDOK(ID_PEER_FILE_REMOTE_DROPLIST,OnSelectChange)
ON_NOTIFY(NM_DBLCLK,1001, OnRemoteLD )
ON_NOTIFY(NM_RCLICK,1001, OnLocalRC )
ON_NOTIFY(LVN_BEGINDRAG,1001, OnBeginDrag)
ON_COMMAND(IDR_FILE_REMOTE_CREATEDIR, OnFileRemoteCreatedir)
ON_COMMAND(IDR_FILE_REMOTE_DELFILE, OnFileRemoteDelfile)
ON_COMMAND(IDR_FILE_REMOTE_EXE, OnFileRemoteExe)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPeerFileRemoteListView drawing
void CPeerFileRemoteListView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CPeerFileRemoteListView diagnostics
#ifdef _DEBUG
void CPeerFileRemoteListView::AssertValid() const
{
CView::AssertValid();
}
void CPeerFileRemoteListView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPeerFileRemoteListView message handlers
int CPeerFileRemoteListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
if(!list.Create( WS_VISIBLE|WS_CHILD,CRect(0,0,0,0),this,1001))
return -1;
list.ModifyStyle(0,LVS_REPORT);
style=LVS_REPORT;
LVCOLUMN colinfo;
memset(&colinfo,0,sizeof(colinfo));
colinfo.mask=LVCF_TEXT|LVCF_WIDTH;
colinfo.cx=100;
colinfo.cchTextMax=255;
colinfo.pszText="名称";
colinfo.iSubItem=0;
colinfo.iOrder=0;
list.InsertColumn(0,&colinfo);
colinfo.pszText="类型";
colinfo.iSubItem=1;
colinfo.iOrder=1;
list.InsertColumn(1,&colinfo);
colinfo.pszText="大小";
colinfo.iSubItem=2;
colinfo.iOrder=2;
list.InsertColumn(2,&colinfo);
colinfo.pszText="修改时间";
colinfo.iSubItem=3;
colinfo.iOrder=3;
list.InsertColumn(3,&colinfo);
imagelists.Create(16,16,ILC_MASK,16,1);
imagelistb.Create(32,32,ILC_MASK,16,1);
imagelists.Add(AfxGetApp()->LoadIcon(IDI_DIR));
imagelistb.Add(AfxGetApp()->LoadIcon(IDI_DIR));
list.SetImageList(&imagelists,LVSIL_SMALL);
list.SetImageList(&imagelistb,LVSIL_NORMAL);
list.Register();
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
|CBRS_TOOLTIPS | CBRS_FLYBY /*| CBRS_SIZE_DYNAMIC*/) ||
!m_wndToolBar.LoadToolBar(IDR_PEER_FILE_REMOTE))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
AddTooBarButton();
if(!image.Create(16,16,ILC_MASK,4,1))
return -1;
image.Add(AfxGetApp()->LoadIcon(IDI_DRIVER_A));
image.Add(AfxGetApp()->LoadIcon(IDI_DRIVER_FIX));
image.Add(AfxGetApp()->LoadIcon(IDI_DRIVER_CD));
image.Add(AfxGetApp()->LoadIcon(IDI_DRIVER_NET));
m_wndToolBar.m_driver.SetImageList(&image);
return 0;
}
void CPeerFileRemoteListView::AddTooBarButton()
{
#define COMBO_BOX_WIDTH 80
int index = 0;
CRect rect;
while(m_wndToolBar.GetItemID(index)!= ID_PEER_FILE_REMOTE_STATIC)
index++;
m_wndToolBar.SetButtonInfo(index,
ID_PEER_FILE_REMOTE_STATIC,TBBS_SEPARATOR,110);
m_wndToolBar.GetItemRect(index, &rect);
rect.top+=4;
// rect.bottom += 2;
// then .Create the combo box and show it
if (!m_wndToolBar.m_title.Create( "Remote Machine",
WS_CHILD|WS_VISIBLE ,
rect, &m_wndToolBar, ID_PEER_FILE_REMOTE_STATIC))
{
TRACE0("Failed to create combo-box\n");
return ;
}
index = 0;
while(m_wndToolBar.GetItemID(index)!= ID_PEER_FILE_REMOTE_DROPLIST)
index++;
m_wndToolBar.SetButtonInfo(index,
ID_PEER_FILE_REMOTE_DROPLIST,TBBS_SEPARATOR,COMBO_BOX_WIDTH);
m_wndToolBar.GetItemRect(index, &rect);
rect.top+=2;
rect.bottom += 200;
// then .Create the combo box and show it
if (!m_wndToolBar.m_driver.Create(
WS_CHILD|WS_VISIBLE | CBS_AUTOHSCROLL |
CBS_DROPDOWNLIST ,
rect, &m_wndToolBar, ID_PEER_FILE_REMOTE_DROPLIST))
{
TRACE0("Failed to create combo-box\n");
return ;
}
m_wndToolBar.m_driver.ShowWindow(SW_SHOW);
}
void CPeerFileRemoteListView::OnPeerFileRemoteList()
{
// TODO: Add your command handler code here
list.ModifyStyle(style,LVS_LIST);
style=LVS_LIST;
}
void CPeerFileRemoteListView::OnPeerFileReomteBig()
{
// TODO: Add your command handler code here
list.ModifyStyle(style,LVS_ICON );
style=LVS_ICON;
}
void CPeerFileRemoteListView::OnPeerFileReomteReport()
{
// TODO: Add your command handler code here
list.ModifyStyle(style,LVS_REPORT);
style=LVS_REPORT;
}
void CPeerFileRemoteListView::OnPEERFILEREOMTESMAll()
{
// TODO: Add your command handler code here
list.ModifyStyle(style,LVS_SMALLICON );
style=LVS_SMALLICON ;
}
void CPeerFileRemoteListView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
CView::OnSize(nType, cx, cy);
m_wndToolBar.MoveWindow(0,0,cx,25);
list.MoveWindow(0,25,cx,cy-25);
}
void CPeerFileRemoteListView::OnSelectChange()
{
m_wndToolBar.m_driver.GetLBText(m_wndToolBar.m_driver.GetCurSel(),path);
AfxGetApp()->DoWaitCursor(1);
Retrive();
AfxGetApp()->DoWaitCursor(0);
}
void CPeerFileRemoteListView::Retrive()
{
CString Mess;
Mess+="返回目录:\""+path+"\" 的所有文件信息!";
list.DeleteAllItems();
WSAEVENT hevent=WSACreateEvent();
if(hevent==WSA_INVALID_EVENT)
{
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
return;
}
SOCKET s;
COMMAND com;
DWORD ret;
int index=0;
CString nowpath;
nowpath=path+"\\*";
int imagecount;
imagecount=imagelists.GetImageCount();
for(int j=1;j<imagecount;j++)
{
imagelists.Remove(j);
imagelistb.Remove(j);
}
CImageList* pSmallImage,* pBigImage;
pSmallImage=list.GetImageList(LVSIL_SMALL);
pBigImage=list.GetImageList(LVSIL_NORMAL);
if(!PeerCreateSocket(&s,PEER_STREAM))
{
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
WSACloseEvent(hevent);
return;
}
if(!PeerConnectSocket(s,ADDRESS,7788))
{
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
WSACloseEvent(hevent);
closesocket(s);
return;
}
com.CommandID=PEER_FILE_GETATTRIB;
if(!PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hevent))
{
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
WSACloseEvent(hevent);
closesocket(s);
return;
}
FILEATTRIB fileattrib;
strcpy(fileattrib.filename,nowpath);
if(!PeerSendDataS(s,(char*)&fileattrib,sizeof(fileattrib),&ret,hevent))
{
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
WSACloseEvent(hevent);
closesocket(s);
return;
}
index=list.GetItemCount();
list.InsertItem(index,".",0);
list.SetItem(index,1,LVIF_TEXT,"文件夹",0,0,0,NULL);
index=list.GetItemCount();
list.InsertItem(index,"..",0);
list.SetItem(index,1,LVIF_TEXT,"文件夹",0,0,0,NULL);
index=list.GetItemCount();
int indeximage;
SHFILEINFO shfi;
while(PeerRecvDataS(s,(char*)&fileattrib,sizeof(fileattrib),&ret,hevent))
{
SHGetFileInfo(fileattrib.filename,
FILE_ATTRIBUTE_NORMAL,
&shfi, sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME );
indeximage=pSmallImage->Add(shfi.hIcon);
pBigImage->Add(shfi.hIcon);
index=list.GetItemCount();
list.InsertItem(index,fileattrib.filename,
strcmp(fileattrib.attrib,"文件夹")==0?0:indeximage);
list.SetItem(index,1,LVIF_TEXT,fileattrib.attrib,0,0,0,NULL);
list.SetItem(index,2,LVIF_TEXT,fileattrib.len,0,0,0,NULL);
list.SetItem(index,3,LVIF_TEXT,fileattrib.time,0,0,0,NULL);
}
Message(Mess.GetBuffer(Mess.GetLength()),"成功");
WSACloseEvent(hevent);
closesocket(s);
}
void CPeerFileRemoteListView::OnRemoteLD(NMHDR* pNotifyStruct,LRESULT* result)
{
if(list.GetItemCount()<=0)
return;
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNotifyStruct;
if(lpnmlv->iItem>=0)
{
CString filename,type;
filename=list.GetItemText(lpnmlv->iItem,0);
type=list.GetItemText(lpnmlv->iItem,1);
ffile=filename;
if(type=="文件夹")
{
if(filename==".")
goto there;
else if(filename=="..")
{
int findc=path.ReverseFind('\\');
if(findc==-1)
goto there;
path=path.Left(findc);
}
else
{
path=path+"\\"+filename;
}
AfxGetApp()->DoWaitCursor(1);
Retrive();
AfxGetApp()->DoWaitCursor(0);
}
else
{
// ShellExecute(NULL, _T("open"), path+"\\"+filename, NULL,NULL, SW_SHOWNORMAL);
CPoint point;
::GetCursorPos(&point);
// ScreenToClient(&point);
CMenu menu;
VERIFY(menu.LoadMenu(IDR_FILE_REMOTE));
CMenu* pPopup = menu.GetSubMenu(1);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
}
there:
*result=0;
}
void CPeerFileRemoteListView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
}
void CPeerFileRemoteListView::OnBeginDrag(NMHDR* pNotifyStruct,LRESULT* result)
{
if(list.GetItemCount()<=2)
return;
//确信要拖动,而不是随便点击
//按下左键250ms则认为要拖动
Sleep(250);
MSG msg;
::PeekMessage(
&msg,
GetSafeHwnd(),
WM_LBUTTONUP,
WM_LBUTTONUP,
PM_NOREMOVE
);
//随意点击而已,返回
if( msg.message==WM_LBUTTONUP )
return;
DRAG Contens;
Contens.flag=1;
Contens.wnd=(DWORD)this;
HGLOBAL hData = GlobalAlloc(GHND|GMEM_SHARE,sizeof(DRAG) );
char *pS = (char *)GlobalLock( hData );
memcpy( pS, (char*)&Contens,sizeof(DRAG));
GlobalUnlock( hData );
list.m_bDraging = TRUE; //开始拖动
COleDataSource source;
source.CacheGlobalData( RegisterClipboardFormat("ListCtrl")/*CF_TEXT*/, hData );
source.DoDragDrop( DROPEFFECT_COPY );
GlobalFree( hData );
list.m_bDraging = FALSE; //完成拖动
*result=0;
}
void CPeerFileRemoteListView::OnLocalRC(NMHDR* pNotifyStruct,LRESULT* result)
{
if(list.GetItemCount()<=0)
return;
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNotifyStruct;
CPoint point;
::GetCursorPos(&point);
// ScreenToClient(&point);
CMenu menu;
VERIFY(menu.LoadMenu(IDR_FILE_REMOTE));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
if(lpnmlv->iItem<0)
pPopup->EnableMenuItem(IDR_FILE_REMOTE_DELFILE,MF_GRAYED);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
void CPeerFileRemoteListView::OnFileRemoteCreatedir()
{
// TODO: Add your command handler code here
CCreateDirDlg dir(0,this);
dir.DoModal();
}
void CPeerFileRemoteListView::OnFileRemoteDelfile()
{
// TODO: Add your command handler code here
if(MessageBox( "确定要删除吗?","提示",MB_YESNO)!=IDYES)
return;
CString filename,attrib;
WSAEVENT hEvent=WSACreateEvent();
if(hEvent==WSA_INVALID_EVENT)
{
return;
}
SOCKET s;
if(!PeerCreateSocket(&s,PEER_STREAM))
{
WSACloseEvent(hEvent);
return;
}
if(!PeerConnectSocket(s,ADDRESS,7788))
{
WSACloseEvent(hEvent);
closesocket(s);
return;
}
DWORD retLen;
FILEINFO fi;
COMMAND com;
com.CommandID=PEER_FILE_DELETEFILE;
if(!PeerSendDataS(s,(char*)&com,sizeof(com),&retLen,hEvent))
{
WSACloseEvent(hEvent);
closesocket(s);
return;
}
POSITION pos = list.GetFirstSelectedItemPosition();
int nItem;
while (pos)
{
nItem = list.GetNextSelectedItem(pos);
filename=list.GetItemText(nItem,0);
attrib=list.GetItemText(nItem,1);
if(filename=="." || filename=="..")
continue;
filename=path+"\\"+filename;
strcpy(fi.filename,filename);
if(attrib=="文件夹")
{
fi.dir=true;
}
else
{
fi.dir=false;
}
if(!PeerSendDataS(s,(char*)&fi,sizeof(fi),&retLen,hEvent))
{
WSACloseEvent(hEvent);
closesocket(s);
return;
}
if(!PeerRecvDataS(s,(char*)&com,sizeof(com),&retLen,hEvent))
{
WSACloseEvent(hEvent);
closesocket(s);
return;
}
CString Mess="删除:"+filename;
if(com.CommandID==PEER_CFM_OK)
Message(Mess.GetBuffer(Mess.GetLength()),"成功");
else
Message(Mess.GetBuffer(Mess.GetLength()),"失败");
}
Retrive();
WSACloseEvent(hEvent);
closesocket(s);
}
void CPeerFileRemoteListView::OnFileRemoteExe()
{
// TODO: Add your command handler code here
WSAEVENT hEvent=WSACreateEvent();
if(hEvent==WSA_INVALID_EVENT)
{
return;
}
SOCKET s;
if(!PeerCreateSocket(&s,PEER_STREAM))
{
WSACloseEvent(hEvent);
return;
}
if(!PeerConnectSocket(s,ADDRESS,7788))
{
WSACloseEvent(hEvent);
closesocket(s);
return;
}
DWORD retLen;
FILEINFO fi;
COMMAND com;
com.CommandID=PEER_FILE_EXCUTE;
if(!PeerSendDataS(s,(char*)&com,sizeof(com),&retLen,hEvent))
{
WSACloseEvent(hEvent);
closesocket(s);
return;
}
CString file;
file=path+"\\"+ffile;
strcpy(fi.filename,file);
if(!PeerSendDataS(s,(char*)&fi,sizeof(fi),&retLen,hEvent))
{
WSACloseEvent(hEvent);
closesocket(s);
return;
}
WSACloseEvent(hEvent);
CString Mess="执行:"+file;
Message(Mess.GetBuffer(Mess.GetLength()),"未定");
closesocket(s);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -