⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 detailview.cpp

📁 磁盘容量扫描、但界面和程序结构非常不错
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	else 
		pCurArray = &m_arrayRootItem;
	int nCount = pCurArray->GetSize();
	CInfoCtrlItem* pItem;
	
	for (int i = 0; i < nCount; i++)
	{
		pItem = pCurArray->GetAt(i);
		if (pItem->m_nITEMID == nID)
		{
			pItem->m_nPercentData = n;
			pItem->m_strTextData = str;

			return;
		}
	}
}

void CInfoCtrl::UpdateCtrl()
{
	InvalidateRect(NULL, FALSE);
}

void CInfoCtrl::DrawTextItem(CDC *pDC, const CRect &rc, CInfoCtrlItem* pItem)
{
	CRect rcItem(rc);
	rcItem.right = rcItem.Width()*3 / 7;
	pDC->DrawText(pItem->m_strItemName, rcItem, DT_LEFT|DT_VCENTER|DT_SINGLELINE);

	rcItem.left = rcItem.right;
	rcItem.right = rc.right;
	pDC->FillSolidRect(rcItem, RGB(0,0,0));

	COLORREF oldTextColor = pDC->SetTextColor(RGB(255,255,128));
	pDC->DrawText(pItem->m_strTextData, rcItem, DT_CENTER|DT_VCENTER|DT_SINGLELINE);	
	pDC->SetTextColor(oldTextColor);
	
	pDC->DrawEdge(rcItem, EDGE_SUNKEN, BF_RECT);
}

void CInfoCtrl::DrawPercentItem(CDC *pDC, const CRect &rc, CInfoCtrlItem* pItem)
{
	CRect rcItem(rc);
	rcItem.right = rcItem.Width()*3 / 7;
	pDC->DrawText(pItem->m_strItemName, rcItem, DT_LEFT|DT_VCENTER|DT_SINGLELINE);

	rcItem.left = rcItem.right;
	rcItem.right = rc.right;
	pDC->FillSolidRect(rcItem, RGB(0,0,0));

	COLORREF oldTextColor = pDC->SetTextColor(RGB(255,255,128));
	CString str;
	str.Format("%d%%", pItem->m_nPercentData);
	DrawPercentBar(pDC, rcItem, ((double)pItem->m_nPercentData)/100.0, 
					str, NULL);
	pDC->DrawText(pItem->m_strTextData, rcItem, DT_CENTER|DT_VCENTER|DT_SINGLELINE);	
	pDC->SetTextColor(oldTextColor);
	
	
	pDC->DrawEdge(rcItem, EDGE_SUNKEN, BF_RECT);
}

void CDetailView::OnShowChart() 
{
	m_bShowChart = !m_bShowChart;
	
	UpdateShowChart();
	RepositionCtrls();
	InvalidateRect(NULL, FALSE);
}

void CDetailView::OnUpdateShowChart(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bShowChart);
}

void CDetailView::UpdateShowInfo()
{
	m_wndInfo.ShowWindow(m_bShowInfo?SW_SHOW:SW_HIDE);
	m_wndInfo.EnableWindow(m_bShowInfo);

	if (!m_bShowChart)
	{
		m_wndSplitVer.ShowWindow(m_bShowInfo?SW_SHOW:SW_HIDE);
		m_wndSplitVer.EnableWindow(m_bShowInfo);		
	}
}
void CDetailView::UpdateShowChart()
{
	m_wndChart.ShowWindow(m_bShowChart?SW_SHOW:SW_HIDE);
	m_wndChartInfo.ShowWindow(m_bShowChart?SW_SHOW:SW_HIDE);
	m_wndSplitHor.ShowWindow(m_bShowChart?SW_SHOW:SW_HIDE);
	
	m_wndChart.EnableWindow(m_bShowChart);
	m_wndChartInfo.EnableWindow(m_bShowChart);
	m_wndSplitHor.EnableWindow(m_bShowChart);

	if (!m_bShowInfo)
	{
		m_wndSplitVer.ShowWindow(m_bShowChart?SW_SHOW:SW_HIDE);
		m_wndSplitVer.EnableWindow(m_bShowChart);		
	}

}

void CDetailView::OnShowInfo() 
{
	m_bShowInfo = !m_bShowInfo;	

	UpdateShowInfo();
	RepositionCtrls();	
	InvalidateRect(NULL, FALSE);
}

void CDetailView::OnUpdateShowInfo(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bShowInfo);
}

void CDetailView::OnSplitWnd()
{
	CRect rc, rcClient;
	GetClientRect(&rcClient);

	if (m_wndSplitVer.IsWindowVisible())
	{
		m_wndSplitVer.GetWindowRect(&rc);
		ScreenToClient(&rc);
		m_nInfoWidth = rcClient.right - rc.right;
	}

	if (m_wndSplitHor.IsWindowVisible())
	{
		m_wndSplitHor.GetWindowRect(&rc);
		ScreenToClient(&rc);
		m_nInfoHeight = rcClient.bottom - rc.bottom;
	}

	RepositionCtrls();
	InvalidateRect(NULL, FALSE);
	m_wndChart.RedrawWindow();
	m_wndChartInfo.RedrawWindow();
}

int CALLBACK CDetailView::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CMyFolder* pItem1 = (CMyFolder*) lParam1;
    CMyFolder* pItem2 = (CMyFolder*) lParam2;

	int nResult=0;

	switch (lParamSort)
	{
	case 0: // Title
		nResult = (pItem1->GetItemText(0)).CompareNoCase(pItem2->GetItemText(0));
		break;
	case 1: // Size
		nResult = int(pItem1->GetFolderSize(TRUE) - pItem2->GetFolderSize(TRUE));
		break;
	case 2: // Folders
		nResult = int(pItem1->GetFolderCount(TRUE) - pItem2->GetFolderCount(TRUE));
		break;
	case 3: // Files
		nResult = int(pItem1->GetFileCount(TRUE) - pItem2->GetFileCount(TRUE));
		break;
	}
	
	if (m_bChartInfoSortAscending == FALSE)
		nResult = 0 - nResult;

	return nResult;//StrComp(&(pItem1->GetItemText()), &(pItem2->GetItemText()));
}

int CInfoCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	InsertColumn(IDS_INFO_DISK_PARTITION, &m_arrayDiskInfo);
	InsertColumn(IDS_INFO_DISK_TOTALSPACE, &m_arrayDiskInfo);
	InsertColumn(IDS_INFO_DISK_USAGE, &m_arrayDiskInfo);

	InsertColumn(IDS_INFO_CONTAINS_FILESIZE, &m_arrayInfoItem);
	InsertColumn(IDS_INFO_CONTAINS_FILECOUNT, &m_arrayInfoItem);
	InsertColumn(IDS_INFO_CONTAINS_FOLDERCOUNT, &m_arrayInfoItem);	

	InsertColumn(IDS_INFO_DISK_TOTALSPACE, &m_arrayRootItem);
	InsertColumn(IDS_INFO_ALLOCATED, &m_arrayRootItem);
	InsertColumn(IDS_INFO_DISK_USAGE, &m_arrayRootItem);
	InsertColumn(IDS_INFO_CONTAINS_FILESIZE, &m_arrayRootItem);
	InsertColumn(IDS_INFO_EFFICIENCY, &m_arrayRootItem);	
	InsertColumn(IDS_INFO_CONTAINS_FILECOUNT, &m_arrayRootItem);	
	InsertColumn(IDS_INFO_CONTAINS_FOLDERCOUNT, &m_arrayRootItem);

	m_font.CreateFont(10, 0,0,0,FW_NORMAL, 0,0,0,
		DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
		DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif");

	return 0;
}

void CInfoCtrl::ResetDriveValues()
{
	m_strDriveTitle = _T("");
	m_strFolderTitle = _T("");
	int nCount = m_arrayDiskInfo.GetSize();
	CInfoCtrlItem* pItem;
	
	for (int i = 0; i < nCount; i++)
	{
		pItem = m_arrayDiskInfo.GetAt(i);

		pItem->m_nPercentData = -1;
		pItem->m_strTextData = _T("");
	}
}

int CInfoCtrl::DrawItemArray(CDC *pDC, CRect rc, int nItem)
{
	CInfoCtrlItem* pItem;

	CInfoCtrlItemArray* pCurArray;
	if (nItem == 0)
		pCurArray = &m_arrayDiskInfo;
	else if (nItem == 1)
		pCurArray = &m_arrayInfoItem;
	else 
		pCurArray = &m_arrayRootItem;

	int nRealCount = 0;
	int nCount = pCurArray->GetSize();
	for (int i = 0; i < nCount; i++)
	{
		pItem = pCurArray->GetAt(i);
		if ((pItem->m_nPercentData != -1) || (!pItem->m_strTextData.IsEmpty()))
			nRealCount ++;

	}

	if (!nRealCount)
		return 0;

	CRect rcItem = rc;
	rcItem.bottom = rcItem.top + _N_ITEMHEIGHT_;
	// Draw Title bar
	CString str;
	if (nItem == 0)
		str = m_strDriveTitle;
	else if (nItem == 1)
		str.LoadString(IDS_SELECTED_FOLDER);
	else 
		str = m_strFolderTitle;
		
	pDC->DrawText(str, rcItem, DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_PATH_ELLIPSIS);

	rcItem.DeflateRect(4,0);
	rcItem.OffsetRect(0, _N_ITEMHEIGHT_ + 3*2);
		
	for (i = 0; i < nCount; i++)
	{
		pItem = pCurArray->GetAt(i);
		if (pItem->m_nPercentData != -1)
		{
			DrawPercentItem(pDC, rcItem, pItem);
			rcItem.OffsetRect(0, _N_ITEMHEIGHT_ + 3);			
		}else if (!pItem->m_strTextData.IsEmpty())
		{
			DrawTextItem(pDC, rcItem, pItem);
			rcItem.OffsetRect(0, _N_ITEMHEIGHT_ + 3);		
		}

	}
	
	rcItem.OffsetRect(0, -_N_ITEMHEIGHT_);
	rcItem.InflateRect(4,0);
	rcItem.top = rc.top + _N_ITEMHEIGHT_ + 1;
	rcItem.bottom += 2;
	if (nRealCount)
		pDC->DrawEdge(rcItem, EDGE_ETCHED, BF_RECT);

	return rcItem.bottom - rc.top;
}

void CDetailView::ShowMe()
{
	
	int nDetailStartup = AfxGetApp()->GetProfileInt("Settings", "DetailStartUpMode",   0);
	CString strLastOpened = AfxGetApp()->GetProfileString("Settings", "DetailLastOpened",   "");

	CString str;
	str.LoadString(IDS_SELECT_HERE);

	if (m_strTitle.IsEmpty())
	{
		m_strTitle.LoadString(IDS_SELECT_HERE);
		SetTitle(m_strTitle);
	}

	if (str.CompareNoCase(m_strTitle) == 0)
	{
		switch (nDetailStartup)
		{
		case 0: // Last opened
			if (strLastOpened.IsEmpty())
				OnSelectFolder();
			else
			{
				if (strLastOpened.Right(1) != "\\")
					strLastOpened += "\\";
				
				SetTitle(strLastOpened);				
				SetCurrentFolder(strLastOpened);
			}
			break;
		case 1: // Always ask
			OnSelectFolder();
			break;
		}
		
	}else
	{
		if (m_strTitle.CompareNoCase(m_wndDiskTree.GetCurrentFolder()) != 0)
		//if (!m_bScanFinished)
		{
			SetTitle(m_strTitle);
			SetCurrentFolder(m_strTitle);
		}
	}	
}

void CDetailView::OnDraw(CDC* pDC) 
{
	
	
}

BOOL CDetailView::OnPreparePrinting(CPrintInfo* pInfo) 
{
	// default preparation
	return m_wndDiskTree.OnPreparePrinting(pInfo, this); //Guess the # of pages
	//return DoPreparePrinting(pInfo);
}

void CDetailView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) 
{
	CString str;
	AfxGetMainWnd()->GetWindowText(str);
	COleDateTime now = COleDateTime::GetCurrentTime();
	CString strDate = now.Format(LOCALE_NOUSEROVERRIDE, LANG_USER_DEFAULT);
	m_wndDiskTree.OnBeginPrinting(pDC, pInfo, str, strDate);
}

void CDetailView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) 
{
	m_wndDiskTree.OnEndPrinting(pDC, pInfo);//Clean up those printing fonts
}

void CDetailView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
{
	m_wndDiskTree.OnPrint(pDC, pInfo);
}

void CDetailView::OnPrintPreview()
{
	((CMainFrame*)AfxGetMainWnd())->EnableSwitchButton(FALSE);
	//CView::OnFilePrintPreview();
	// need to use CMyPreviewView class
	CPrintPreviewState* pState = new CPrintPreviewState;

	if (!DoPrintPreview(IDD_PRINT_PREVIEW, this, RUNTIME_CLASS(CPreviewViewEx), pState))
	{
		TRACE0("Error: OnFileImprovedprintpreview failed.\n");
		AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
		delete pState;      // preview failed to initialize, delete State now
	}
}

void CDetailView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView) 
{
	CView ::OnEndPrintPreview(pDC, pInfo, point, pView);

	((CMainFrame*)AfxGetMainWnd())->EnableSwitchButton(TRUE);
}

void CDetailView::OnFileSelect() 
{
	OnSelectFolder();
}

void CDetailView::OnUpdateRescan(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	
}

void CDetailView::OnUpdateFileSelect(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	
}

void CDetailView::OnDestroy() 
{
	AfxGetApp()->WriteProfileInt("Settings", "ShowChart", m_bShowChart);
	AfxGetApp()->WriteProfileInt("Settings", "ShowInfoBar", m_bShowInfo);

	AfxGetApp()->WriteProfileInt("Settings", "InfoWidth", m_nInfoWidth);
	AfxGetApp()->WriteProfileInt("Settings", "InfoHeight", m_nInfoHeight);
	
	CView ::OnDestroy();
}

void CDetailView::AutoResizeColumns()
{
	m_wndDiskTree.ResizeColumns(TRUE);
	
	// Resize columns
	int nCount = ((CHeaderCtrl*)m_wndChartInfo.GetDlgItem(0))->GetItemCount();
	CRect rc;
	m_wndChartInfo.GetClientRect(&rc);
	int nWidth = (rc.Width() - GetSystemMetrics(SM_CXHSCROLL)) / 2;
	
	int nSubWidth = nWidth/(nCount-1);
	int nTotalSub = 0;
	for (int i=1; i<nCount; i++)
	{
		nTotalSub += nSubWidth;
		m_wndChartInfo.SetColumnWidth(i, nSubWidth);
	}

	m_wndChartInfo.SetColumnWidth(0, rc.Width()- GetSystemMetrics(SM_CXHSCROLL) - nTotalSub-1);
	
	
}

void CDetailView::OnSaveResult() 
{
	CString strFilters;
	strFilters.LoadString(IDS_TYPE_HTML);
	
	CFileDialog dlg(FALSE, "htm", "result.htm", OFN_OVERWRITEPROMPT |
		OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,strFilters, this);
	
	CFile file;
	
	if (dlg.DoModal() != IDOK)
		return;

	BeginWaitCursor();
	CString strFile = dlg.GetPathName();	

	CreateHTML(strFile, m_strTitle);

	InsertHTMLHeader(m_strTitle);
	InsertHTMLHLine();

	//Build the table
	CreateHTMLTable(_T("cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%%\""));

	//First row
	CreateHTMLRow();
	CString str, strCell;
	for(int x = 0; x < 4; x++)
    {
		str.LoadString(IDS_COL_FOLDERTREE + x);
		strCell = CString("<strong><font color=\"#FFFFFF\">") + str + CString("</font></strong>");

		InsertHTMLCell(_T("bgcolor=\"#008080\""), strCell);
    }
	FinishHTMLRow();


	// Build the item tree
	m_wndDiskTree.BuildTreeToHTML();

	FinishHTMLTable();

	InsertHTMLHLine();

	CString strOutput;
	strOutput.LoadString(IDS_OUTPUT);
	AddHTMLLine(strOutput);

	FinishHTML();

	// Copy gif files to the new folder
	TCHAR sDrive[_MAX_DRIVE];
	TCHAR sDir[_MAX_DIR];
	TCHAR sFname[_MAX_FNAME];
	TCHAR sExt[_MAX_EXT];
	_tsplitpath(strFile, sDrive, sDir, sFname, sExt);
	
	CString strTarget(CString(sDrive) + CString(sDir));
	int nLen = strTarget.GetLength();
	if (strTarget.GetAt(nLen-1) != _T('\\'))
		strTarget += _T("\\");
	CString strSrc = GetHomeDirectory();

	CopyFile(strSrc+_T("images\\empty.gif"), strTarget+_T("empty.gif"), TRUE);
	CopyFile(strSrc+_T("images\\file.gif"), strTarget+_T("file.gif"), TRUE);
	CopyFile(strSrc+_T("images\\folder_c.gif"), strTarget+_T("folder_c.gif"), TRUE);
	CopyFile(strSrc+_T("images\\folder_o.gif"), strTarget+_T("folder_o.gif"), TRUE);
	CopyFile(strSrc+_T("images\\line.gif"), strTarget+_T("line.gif"), TRUE);
	CopyFile(strSrc+_T("images\\linelast.gif"), strTarget+_T("linelast.gif"), TRUE);
	CopyFile(strSrc+_T("images\\linever.gif"), strTarget+_T("linever.gif"), TRUE);

	EndWaitCursor();

	GotoURL(CString(_T("file:///")) + strFile);
}

void CDetailView::OnToolsSafeclean() 
{
}

void CDetailView::OnCollapseAll() 
{	
	m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_SUBTRACT,0);
}

void CDetailView::OnExpandAll() 
{
	m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_MULTIPLY,0);
}

void CDetailView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	switch(nChar)
	{
		case VK_MULTIPLY:
			m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_MULTIPLY,0);
			break;
		case VK_ADD:
			m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_ADD,0);
			break;
		case VK_SUBTRACT:
			m_wndDiskTree.SendMessage(WM_KEYDOWN,(WPARAM)VK_SUBTRACT,0);
			break;
		default :
			CView ::OnKeyDown(nChar, nRepCnt, nFlags);
	}		
}

void CDetailView::OnUpdateSaveResult(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	
}

void CDetailView::OnUpdateFilePrint(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	
}

void CDetailView::OnUpdateFilePrintPreview(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_wndDiskTree.m_pThread==0);	
}

BOOL CDetailView::OnHelpInfo(HELPINFO* pHelpInfo) 
{
	return TRUE;
}

⌨️ 快捷键说明

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