www.pudn.com > NetPaw.rar > MainFrm.cpp


// MainFrm.cpp : CMainFrame 类的实现 
// 
 
#include "stdafx.h" 
#include "NetPaw.h" 
 
#include "MainFrm.h" 
#include "LeftView.h" 
#include "fileview.h" 
#include "NetPawView.h" 
#include "downloaddlg.h" 
#include "downloadfile.h" 
#include "netpawdoc.h" 
#include ".\mainfrm.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
 
 
// CMainFrame 
 
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
	ON_WM_CREATE() 
	ON_UPDATE_COMMAND_UI_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnUpdateViewStyles) 
	ON_COMMAND_RANGE(AFX_ID_VIEW_MINIMUM, AFX_ID_VIEW_MAXIMUM, OnViewStyle) 
	ON_COMMAND(ID_BTNDOWNLOAD, OnBtnDownload) 
	ON_MESSAGE(WM_USER_STATUSNOTIFY,OnStatusNotify) 
	ON_MESSAGE(WM_USER_NETSPEED, OnNetSpeed) 
	ON_MESSAGE(WM_USER_DOWNLDIEURL, OnDownldIEUrl) 
	ON_WM_TIMER() 
END_MESSAGE_MAP() 
 
static UINT indicators[] = 
{ 
	ID_SEPARATOR,           // 状态行指示器 
	ID_INDICATOR_PROGRESS, 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL, 
}; 
 
 
// CMainFrame 构造/析构 
 
CMainFrame::CMainFrame() 
	: m_bTimerOn(FALSE) 
{ 
	// TODO: 在此添加成员初始化代码 
} 
 
CMainFrame::~CMainFrame() 
{ 
} 
 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP 
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) 
	{ 
		TRACE0("未能创建工具栏\n"); 
		return -1;      // 未能创建 
	} 
 
	// large toolbar icon 
	CBitmap bitmap; 
	bitmap.LoadBitmap(IDB_BMPTOOLBAR); 
	m_imgList.Create( 24, 24, ILC_COLOR8|ILC_MASK, 5, 1 ); 
	m_imgList.Add(&bitmap, RGB(255, 0, 255)); 
 
	m_wndToolBar.GetToolBarCtrl().SetImageList(&m_imgList); 
 
	// status bar 
	if (!m_wndStatusBar.Create(this) || 
		!m_wndStatusBar.SetIndicators(indicators, 
		  sizeof(indicators)/sizeof(UINT))) 
	{ 
		TRACE0("未能创建状态栏\n"); 
		return -1;      // 未能创建 
	} 
	m_wndStatusBar.SetPaneStyle(1, SBPS_STRETCH); 
 
	// TODO: 如果不需要工具栏可停靠,则删除这三行 
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
	EnableDocking(CBRS_ALIGN_ANY); 
	DockControlBar(&m_wndToolBar); 
 
	return 0; 
} 
 
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, 
	CCreateContext* pContext) 
{ 
	// 创建拆分器窗口 
	if (!m_wndSplitter.CreateStatic(this, 1, 2)) 
		return FALSE; 
 
	if( !m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(200, 200), pContext) ) 
	{ 
		m_wndSplitter.DestroyWindow(); 
		return FALSE; 
	} 
 
	// 二次拆分窗口 
	if( !m_wndSplitter2.CreateStatic( 
		&m_wndSplitter, // our parent window is the first splitter 
		2, 1, // the new splitter is 2 rows, 1 column 
		WS_CHILD | WS_VISIBLE | WS_BORDER, // style, WS_BORDER is needed 
		m_wndSplitter.IdFromRowCol(0, 1) ) ) 
	{ 
		return FALSE; 
	} 
 
	if( !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CFileView), CSize(0, 100), pContext) || 
		!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CNetPawView), CSize(0, 0), pContext)) 
	{ 
		m_wndSplitter2.DestroyWindow(); 
		return FALSE; 
	} 
 
	return TRUE; 
} 
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	if( !CFrameWnd::PreCreateWindow(cs) ) 
		return FALSE; 
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或 
	// 样式 
 
	return TRUE; 
} 
 
 
// CMainFrame 诊断 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
 
// CMainFrame 消息处理程序 
 
CFileView* CMainFrame::GetRightPane() 
{ 
	CWnd* pWnd = m_wndSplitter2.GetPane(0, 0); 
	CFileView* pView = DYNAMIC_DOWNCAST(CFileView, pWnd); 
	return pView; 
} 
 
CNetPawView* CMainFrame::GetRightPane2() 
{ 
	CWnd* pWnd = m_wndSplitter2.GetPane(1, 0); 
	CNetPawView* pView = DYNAMIC_DOWNCAST(CNetPawView, pWnd); 
	return pView; 
} 
 
void CMainFrame::OnUpdateViewStyles(CCmdUI* pCmdUI) 
{ 
	if (!pCmdUI) 
		return; 
 
	// TODO: 自定义或扩展此代码以处理“视图”菜单中的选项 
	CFileView* pView = GetRightPane();  
 
	// 如果右窗格尚未创建或者不是视图, 
	// 则在范围内禁用命令 
 
	if (pView == NULL) 
		pCmdUI->Enable(FALSE); 
	else 
	{ 
		DWORD dwStyle = pView->GetStyle() & LVS_TYPEMASK; 
 
		// 如果命令是 ID_VIEW_LINEUP,则只有在处于 
		// LVS_ICON 或 LVS_SMALLICON 模式时才启用命令 
 
		if (pCmdUI->m_nID == ID_VIEW_LINEUP) 
		{ 
			if (dwStyle == LVS_ICON || dwStyle == LVS_SMALLICON) 
				pCmdUI->Enable(); 
			else 
				pCmdUI->Enable(FALSE); 
		} 
		else 
		{ 
			// 否则,使用点线来反映视图的样式 
			pCmdUI->Enable(); 
			BOOL bChecked = FALSE; 
 
			switch (pCmdUI->m_nID) 
			{ 
			case ID_VIEW_DETAILS: 
				bChecked = (dwStyle == LVS_REPORT); 
				break; 
 
			case ID_VIEW_SMALLICON: 
				bChecked = (dwStyle == LVS_SMALLICON); 
				break; 
 
			case ID_VIEW_LARGEICON: 
				bChecked = (dwStyle == LVS_ICON); 
				break; 
 
			case ID_VIEW_LIST: 
				bChecked = (dwStyle == LVS_LIST); 
				break; 
 
			default: 
				bChecked = FALSE; 
				break; 
			} 
 
			pCmdUI->SetRadio(bChecked ? 1 : 0); 
		} 
	} 
} 
 
void CMainFrame::OnViewStyle(UINT nCommandID) 
{ 
	// TODO: 自定义或扩展此代码以处理“视图”菜单中的选项 
	CFileView* pView = GetRightPane(); 
 
	// 如果右窗格已创建而且是 CFileView, 
	// 则处理菜单命令... 
	if (pView != NULL) 
	{ 
		DWORD dwStyle = -1; 
 
		switch (nCommandID) 
		{ 
		case ID_VIEW_LINEUP: 
			{ 
				// 要求列表控件与网格对齐 
				CListCtrl& refListCtrl = pView->GetListCtrl(); 
				refListCtrl.Arrange(LVA_SNAPTOGRID); 
			} 
			break; 
 
		// 其他命令更改列表控件上的样式 
		case ID_VIEW_DETAILS: 
			dwStyle = LVS_REPORT; 
			break; 
 
		case ID_VIEW_SMALLICON: 
			dwStyle = LVS_SMALLICON; 
			break; 
 
		case ID_VIEW_LARGEICON: 
			dwStyle = LVS_ICON; 
			break; 
 
		case ID_VIEW_LIST: 
			dwStyle = LVS_LIST; 
			break; 
		} 
 
		// 更改样式;窗口将自动重新绘制 
		if (dwStyle != -1) 
			pView->ModifyStyle(LVS_TYPEMASK, dwStyle); 
	} 
} 
 
LRESULT CMainFrame::OnStatusNotify(WPARAM wp, LPARAM lp) 
{ 
	UINT nCode = (UINT)wp; 
	CFileView *pView = GetRightPane(); 
 
	CString sInfo(""); 
	switch(nCode) 
	{ 
	case STATUS_CONNECTING: 
		sInfo = _T("正在连接"); 
		break; 
 
	case STATUS_ADDFILE: 
		if( pView ) 
		{ 
			PERFITEM_S stPerfData; 
			CDownloadFile *pDlFile = (CDownloadFile *)lp; 
 
			pDlFile->GetPerfData(&stPerfData); 
			pView->AddFileItem(stPerfData.szFileName, stPerfData.nFileLength); 
		} 
		sInfo = _T("正在下载"); 
		break; 
 
	case STATUS_CONNECTED: 
		// start timer to update UI 
		if( !m_bTimerOn ) 
		{ 
			SetTimer(ID_TIMER_PERFORM, TIMER_INTERVAL, NULL); 
			m_bTimerOn = TRUE; 
		} 
 
		sInfo = _T("已连接"); 
		break; 
 
	case STATUS_CONNECTFAIL: 
		sInfo = _T("连接服务器失败"); 
		break; 
 
	case STATUS_REDIRECTION: 
		sInfo = _T("重定向服务器"); 
		break; 
 
	case STATUS_OPENFILEFAILED: 
		sInfo = _T("打开文件失败"); 
		break; 
 
	case STATUS_SENDFAILED: 
		sInfo = _T("发送数据失败"); 
		break; 
 
	case STATUS_RECEIVEFAILED: 
		sInfo = _T("接收数据失败"); 
		break; 
 
	case STATUS_STOPDOWNLD: 
		sInfo = _T("下载中止"); 
		break; 
 
	case STATUS_FINISHED: 
		{ 
			CNetPawDoc *pDoc = (CNetPawDoc *)GetActiveDocument(); 
			CDownloadFile *pDlFile = (CDownloadFile *)lp; 
 
			// remove finished item to downloaded class 
			pDoc->NotifyFileDone(pDlFile); 
			sInfo = _T("下载完成"); 
		} 
		break; 
 
	default: 
		break; 
	} 
 
	SetStatusBarText(sInfo); 
	return 0; 
} 
 
void CMainFrame::SetStatusBarText(LPCTSTR szText) 
{ 
	m_wndStatusBar.SetPaneText(0, szText); 
} 
 
void CMainFrame::OnBtnDownload() 
{ 
	// TODO: 在此添加命令处理程序代码 
	CNetPawApp *pApp = (CNetPawApp *)AfxGetApp(); 
 
	OnDownldIEUrl(NULL, 0); 
} 
 
void CMainFrame::OnTimer(UINT nIDEvent) 
{ 
	// TODO: 在此添加消息处理程序代码和/或调用默认值 
	CNetPawDoc *pDoc = (CNetPawDoc *)GetActiveDocument(); 
	pDoc->UpdateAllViews(NULL, UPDATE_PARTIAL); 
 
	CFrameWnd::OnTimer(nIDEvent); 
} 
 
LRESULT CMainFrame::OnNetSpeed(WPARAM wp, LPARAM /*lp*/) 
{ 
	m_wndStatusBar.SetDldSpeed( (int)wp ); 
 
	return 0; 
} 
 
LRESULT CMainFrame::OnDownldIEUrl(WPARAM wp, LPARAM /*lp*/) 
{ 
	URLDATA_S *pData = (URLDATA_S *)wp; 
 
	// create dialog 
	CDownloadDlg dlgDownload(this); 
 
	// set profile parameters 
	CNetPawApp *pApp = (CNetPawApp *)AfxGetApp(); 
	dlgDownload.m_sSavePath = pApp->m_sSavePath; 
	dlgDownload.m_nConnections = pApp->m_nConnections; 
 
	if( pData ) 
	{ 
		dlgDownload.m_sDownloadUrl = pData->szDownldUrl; 
		dlgDownload.m_sReferer = pData->szReferer; 
		dlgDownload.m_sWebInfo = pData->szWebInfo; 
	} 
 
	dlgDownload.DoModal(); 
	return 0; 
}