workview.cpp

来自「这是主要完成文件上传功能,对要写ftp程序者是一个好的参考源码」· C++ 代码 · 共 310 行

CPP
310
字号
// WorkView.cpp : implementation file
//

#include "stdafx.h"
#include "EasyFtp.h"
#include "WorkView.h"
#include "LocalView.h"
#include "WebView.h"
#include "MessageView.h"
#include "mainfrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CMainFrame *pMainFrame;
extern CMessageView *pMessageView;
extern CLocalView *pLocalView;
extern CWebView *pWebView;
CWorkView *pWorkView;

extern CString csWebPath;
LV_ITEM lviWork;
extern bool bAutoLoad;
extern BOOL bCmpTime;

CWinThread *MyWorkListThread;
UINT MyWorkListThreadFunction(LPVOID lpParam);

/////////////////////////////////////////////////////////////////////////////
// CWorkView

IMPLEMENT_DYNCREATE(CWorkView, CFormView)

CWorkView::CWorkView()
	: CFormView(CWorkView::IDD)
{
	//{{AFX_DATA_INIT(CWorkView)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	MyWorkListThread=NULL;
	pWorkView=this;
}

CWorkView::~CWorkView()
{
	pWorkView=NULL;
}

void CWorkView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CWorkView)
	DDX_Control(pDX, IDC_WORKLIST, m_WorkList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CWorkView, CFormView)
	//{{AFX_MSG_MAP(CWorkView)
	ON_WM_SIZE()
	ON_NOTIFY(NM_DBLCLK, IDC_WORKLIST, OnDblclkWorklist)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_MY_WORK_LISTNEW,OnListNew)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWorkView diagnostics

#ifdef _DEBUG
void CWorkView::AssertValid() const
{
	CFormView::AssertValid();
}

void CWorkView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CWorkView message handlers

void CWorkView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	RECT rct;
	GetClientRect(&rct);			//得到客户区域大小
	if(m_WorkList.m_hWnd)
	{
		m_WorkList.ShowWindow(SW_HIDE);
		m_WorkList.SetWindowPos(this,0,0,rct.right,rct.bottom,SWP_NOZORDER|SWP_NOMOVE);
		m_WorkList.ShowWindow(SW_SHOW);
	}		//初始化大小
	//******************
	//填写列表名
	static struct
	{
		LPSTR pszText;
		int uiFormat;
	}columns[]={
		_T("文件名称"),LVCFMT_LEFT,
		_T("文件日期"),LVCFMT_CENTER,
		_T("文件大小"),LVCFMT_RIGHT,
		_T("文件目录"),LVCFMT_LEFT,
		_T("状态"),LVCFMT_CENTER,
		_T("进度"),LVCFMT_CENTER,
		_T("索引"),LVCFMT_CENTER
	};
	int j;
	for(int i=0;i<sizeof(columns)/sizeof(columns[0]);i++)
	{
		switch(i)
		{
		case 0:
			j=100;
			break;
		case 1:
			j=100;
			break;
		case 2:
			j=60;
			break;
		case 3:
			j=60;
			break;
		case 4:
			j=50;
			break;
		case 5:
			j=50;
			break;
		default:
			j=50;
			break;
		}
		m_WorkList.InsertColumn(i,columns[i].pszText,columns[i].uiFormat,j);
	}
	m_WorkList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	//画出框格
}

void CWorkView::OnSize(UINT nType, int cx, int cy) 
{
	//CFormView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	if(m_WorkList.m_hWnd)
	{
		m_WorkList.ShowWindow(SW_HIDE);
		m_WorkList.SetWindowPos(this,0,0,cx,cy,SWP_NOZORDER|SWP_NOMOVE);
		m_WorkList.ShowWindow(SW_SHOW);
	}		//调整大小
}

void CWorkView::OnListNew(WPARAM wParam, LPARAM lParam)
{
	pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"正在比较文件列表...");
	
	if((MyWorkListThread = AfxBeginThread(MyWorkListThreadFunction,this)) == NULL)
	{
		//建立失败处理
		return;
	}
	else    //函数会建立一个辅助线程并暂时将其挂起。
	{
		MyWorkListThread->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
		MyWorkListThread->ResumeThread();//调用CWinThread:: ResumeThread使线程开始运行
	}
}


UINT MyWorkListThreadFunction(LPVOID lpParam)//char *cPath, char *cBasePath)
{

	if(pWorkView->m_WorkList.GetItemCount()>0)
	{
		pWorkView->m_WorkList.DeleteAllItems();
	}
	bool bFind=false;
	int iOK=0;
	int i,j,iRec;
	int iLocalTotal,iWebTotal;
	char temp1[3][256],temp2[3][256],temp[256];
	iLocalTotal=pLocalView->m_LocalList.GetItemCount();
	iWebTotal=pWebView->m_WebList.GetItemCount();
	for(i=0;i<iLocalTotal;i++)
	{
		strcpy(temp1[0],pLocalView->m_LocalList.GetItemText(i,3));
		strcat(temp1[0],pLocalView->m_LocalList.GetItemText(i,0));
		//文件全名
		strcpy(temp,strlwr(temp1[0]));
		strcpy(temp1[0],temp);
		//强制小写
		//pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n比较文件");
		//pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)temp1[0]);
		strcpy(temp1[1],pLocalView->m_LocalList.GetItemText(i,1));
		//文件时间
		strcpy(temp1[2],pLocalView->m_LocalList.GetItemText(i,2));
		//文件大小
		for(j=0;j<iWebTotal;j++)
		{
			bFind=false;
			iOK=0;
			strcpy(temp2[0],pWebView->m_WebList.GetItemText(j,3));
			strcat(temp2[0],pWebView->m_WebList.GetItemText(j,0));
			//文件全名
			strcpy(temp,strlwr(temp2[0]));
			strcpy(temp2[0],temp);
			//强制小写
			if(strcmp(temp1[0],temp2[0])==0)
			{
				iRec=j;
				pWebView->m_WebList.SetItemText(j,4,"OK");
				bFind=true;
				if(bCmpTime)
				{
					strcpy(temp2[1],pWebView->m_WebList.GetItemText(j,1));
					//文件时间
					if(strcmp(temp1[1],temp2[1])>0)
					{
						iOK+=1;
						pWebView->m_WebList.SetItemText(j,4,"过时");
					}
				}
				strcpy(temp2[2],pWebView->m_WebList.GetItemText(j,2));
				//文件大小
				if(strcmp(temp1[2],temp2[2])!=0)
				{
					iOK+=8;
					pWebView->m_WebList.SetItemText(j,4,"不同");
				}
				break;
			}
		}
		if(!bFind)
		{
			pLocalView->m_LocalList.SetItemText(i,4,"新");
		}
		else
		{
			switch(iOK)
			{
			case 0:	//一样
				pLocalView->m_LocalList.SetItemText(i,4,"OK");
				break;
			case 1://时间不同
				pLocalView->m_LocalList.SetItemText(i,4,"更新");
				break;
			case 8://大小不同
				pLocalView->m_LocalList.SetItemText(i,4,"不同");
				break;
			case 9://时间和大小不同
				pLocalView->m_LocalList.SetItemText(i,4,"替换");
				break;
			default:
				break;
			}
		}
		if(!(bFind&&(iOK==0)))
		{
			lviWork.iItem=pWorkView->m_WorkList.GetItemCount();
			lviWork.pszText="";
			lviWork.lParam=(LPARAM)lviWork.iItem;
			pWorkView->m_WorkList.InsertItem(&lviWork);
			pWorkView->m_WorkList.SetItemText(lviWork.iItem,0,pLocalView->m_LocalList.GetItemText(i,0));
			pWorkView->m_WorkList.SetItemText(lviWork.iItem,1,pLocalView->m_LocalList.GetItemText(i,1));
			pWorkView->m_WorkList.SetItemText(lviWork.iItem,2,pLocalView->m_LocalList.GetItemText(i,2));
			pWorkView->m_WorkList.SetItemText(lviWork.iItem,3,pLocalView->m_LocalList.GetItemText(i,3));
			pWorkView->m_WorkList.SetItemText(lviWork.iItem,4,pLocalView->m_LocalList.GetItemText(i,4));
			//填写索引
			if(!bFind)//新文件
			{
				sprintf(temp,"新");
			}
			else
			{
				sprintf(temp,"%d",iRec);
			}
			pWorkView->m_WorkList.SetItemText(lviWork.iItem,6,temp);//填写索引
			pWorkView->m_WorkList.SetHotItem(lviWork.iItem);			//标注当前项目
			pWorkView->m_WorkList.EnsureVisible(lviWork.iItem,true);	//滚动影响的卷轴
			pWorkView->m_WorkList.Update(lviWork.iItem);				//重绘List界面,防止花屏
		}
	}
	pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"ok\r\n");
	if(bAutoLoad)//自动模式
	{
		pMainFrame->PostMessage(WM_MY_AUTO_LOAD);
	}
	return true;
}


void CWorkView::OnDblclkWorklist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	int i=m_WorkList.GetNextItem(-1,LVNI_SELECTED);
	if(i!=-1)
	{
		m_WorkList.DeleteItem(i);
	}
	*pResult = 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?