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

📄 detailview.cpp

📁 磁盘容量扫描、但界面和程序结构非常不错
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		RedrawItem(nOld);
		RedrawItem(m_nMouseInCode);

		KillTimer(6);
		SetTimer(6,10,NULL);
	}

	CView ::OnMouseMove(nFlags, point);
}

void CDetailView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if (m_nMouseInCode<1000)
	{
		int n = HitTestEx(point);
		VERIFY(m_nMouseInCode == n);

		if (!m_bMouseDown)
			m_bMouseDown = TRUE;

		RedrawItem(m_nMouseInCode);
	}
	CView ::OnLButtonDown(nFlags, point);
}

int CDetailView::HitTestEx(const CPoint &pt)
{
	if (m_rcTitle.PtInRect(pt))
		return 0;

	return 1000;
}

void CDetailView::RedrawItem(int nCode)
{
	if (nCode == 0)
		InvalidateRect(m_rcTitle, FALSE);
}

void CDetailView::OnTimer(UINT nIDEvent) 
{
	if (m_nMouseInCode < 1000)
	{
		CPoint pt;
		if (!GetCursorPos(&pt))
			return;
		ScreenToClient(&pt);
		
		CRect rcClient;
		GetClientRect(&rcClient);
		rcClient.bottom = rcClient.top + nHeaderWidth;

		if (!rcClient.PtInRect(pt))
		{
			KillTimer(6);

			int nOld = m_nMouseInCode;
			m_nMouseInCode = 1000;
			m_bMouseDown = FALSE;

			RedrawItem(nOld);
		}
	}	
	
	CView ::OnTimer(nIDEvent);
}

void CDetailView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if (m_nMouseInCode<1000)
	{
		int n = HitTestEx(point);
		
		if (m_bMouseDown)
		{
			m_bMouseDown = FALSE;

			if (m_nMouseInCode == n)
			{
				RedrawItem(m_nMouseInCode);
				
				// Doing stuff here
				if (m_nMouseInCode == 0)
				{
					// Only when display another dialog
					int nOld = m_nMouseInCode;
					m_nMouseInCode = 1000;
					RedrawItem(nOld);

					OnSelectFolder();
				}
			}else
			{
				int nOld = m_nMouseInCode;
				
				m_nMouseInCode = 1000;
				RedrawItem(nOld);
			}
		}
	}

	CView ::OnLButtonUp(nFlags, point);
}

void CDetailView::Reset()
{
	m_fontTitle.DeleteObject();
}

void CDetailView::OnRescan()
{
	if (m_wndDiskTree.m_pFolder==NULL)
		OnSelectFolder();
	else
	{
		m_bScanFinished = FALSE;
		m_wndDiskTree.UpdateFolders();
	}
}

void CDetailView::OnStop() 
{
	m_wndDiskTree.Stop();
}

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

void CDetailView::OnSelectFolder()
{
	CDirDialog dlg;
	CString str;
	str.LoadString(IDS_SELECTFOLDER_TO_MONITOR);
	dlg.m_strTitle = str;
	str = m_wndDiskTree.GetCurrentFolder();
	
	dlg.m_strSelDir = (str.GetLength()>3 && str.Right(1) == "\\")?
		str.Left(str.GetLength()-1):str;
	
	if (dlg.DoBrowse() == IDOK)
	{
		str = dlg.m_strPath;
		if (str.Right(1) != "\\")
			str += "\\";
		
		// UpdateSet Title here later
		SetTitle(str);

		SetCurrentFolder(str);
	}
}

void CDetailView::SetCurrentFolder(CString &str)
{
	if (m_wndDiskTree.m_pThread)
		m_wndDiskTree.Stop();

	// Update drive info
	CString strDrive = str.Left(3);
	
	m_wndChartInfo.DeleteAllItems();
	m_wndInfo.ResetInfoValues();
	m_wndChart.Reset();
	m_wndInfo.ResetDriveValues();
	m_wndInfo.ResetRootValues();
	
	CString strTemp;
	char driveName[32];
	char driveType[32];
	DWORD dwDword1, dwDword2, dwDword3;
	if (::GetVolumeInformation(
		strDrive,
		driveName, 32, &dwDword1, &dwDword2, &dwDword3,
		driveType, 32))
	{
		strTemp = driveName;
		strTemp.MakeLower();
		strTemp = strTemp.Right(strTemp.GetLength()-1);
		strTemp = CString(driveName).Left(1) + strTemp;
		strTemp += " (" + strDrive.Left(strDrive.GetLength()-1) + ")";
		m_wndInfo.m_strDriveTitle = strTemp;
		m_wndInfo.m_strFolderTitle = str;
		
		//Type
		strTemp = driveType;
		if (strTemp.CompareNoCase(_T("FAT")) == 0)
			strTemp = _T("FAT16");
		m_wndInfo.SetValue(IDS_INFO_DISK_PARTITION, strTemp, -1, 0);

		// Spaces
		DWORD dwFreeSpaceLow;
		DWORD dwFreeSpaceHigh;
		DWORD dwTotalSpaceLow;
		DWORD dwTotalSpaceHigh;
		if (GetHDSpace(strDrive, dwFreeSpaceLow, dwFreeSpaceHigh,
			dwTotalSpaceLow, dwTotalSpaceHigh))
		{
			long double ldTotal = ((long double)dwTotalSpaceHigh)*
				MAX_DWORD_VALUE + (long double)dwTotalSpaceLow;
			long double ldFree = ((long double)dwFreeSpaceHigh) * 
				MAX_DWORD_VALUE + (long double)dwFreeSpaceLow;
			
			FormatByteSize(ldTotal, strTemp);
			
			// Total
			m_wndInfo.SetValue(IDS_INFO_DISK_TOTALSPACE, strTemp, -1, 0);
			
			// Usage
			m_wndInfo.SetValue(IDS_INFO_DISK_USAGE, "", (int)(((ldTotal-ldFree)/ldTotal)*100), 0);
		}
	}
	m_wndInfo.UpdateCtrl();
	m_wndChart.InvalidateRect(NULL, FALSE);

	m_folder.m_strFolderName = str;
	m_wndDiskTree.m_pFolder = &m_folder;
	m_bScanFinished = FALSE;
	m_wndDiskTree.UpdateFolders();

	// Update shortcut bar
	AfxGetMainWnd()->SendMessage(WM_FOLDER_RESELECTED, 0,0);

	AfxGetApp()->WriteProfileString("Settings", "DetailLastOpened", str);
}

int CDetailView::CompareFolderSize(const void* f1, const void* f2)
{
	CMyFolder* pFolder1 = *(CMyFolder**)f1;
	CMyFolder* pFolder2 = *(CMyFolder**)f2;

	return (int)(pFolder2->GetFolderSize(TRUE) - pFolder1->GetFolderSize(TRUE));
}

void CDetailView::UpdateFolderChart(CMyFolder *pFolder)
{
	m_wndChartInfo.DeleteAllItems();
	m_wndInfo.ResetInfoValues();
	//m_wndInfo.De
	m_wndChart.Reset();
	
	if (!pFolder)
	{
		m_wndInfo.UpdateCtrl();
		m_wndChart.InvalidateRect(NULL, FALSE);
		return;
	}

	if (m_bSelectedIsFile && m_pSelectedFolder)
		delete m_pSelectedFolder;
	m_pSelectedFolder = NULL;

	if (pFolder->IsFile()) // When selecting files, create the file list to display
	{
		m_bSelectedIsFile = true;
		m_pSelectedFolder = new CMyFolder;

		m_pSelectedFolder->m_bSorted = FALSE;

		CString strCurPath = m_wndDiskTree.GetSelectedPath();
		if (strCurPath.Right(1) != "\\")
			strCurPath += "\\";

		// Add files in folder
		HANDLE hFind;
		WIN32_FIND_DATA fd;
		
		char charCmp[MAX_PATH];
		strcpy(charCmp, strCurPath);
		strcat(charCmp, "*.*");	
		
		if ((hFind = ::FindFirstFile ((LPCTSTR) charCmp, &fd)) ==
			INVALID_HANDLE_VALUE) 
			return;
		
		do {
			if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
			{
				CMyFolder* pFile = new CMyFolder;
				pFile->SetTitle(fd.cFileName);
				pFile->m_dFileSize = fd.nFileSizeLow;
				pFile->m_nFileCount = 1;
				pFile->SetReady(1);

				m_pSelectedFolder->m_dFileSize += fd.nFileSizeLow;
				m_pSelectedFolder->Add(pFile);
			}
		} while (::FindNextFile (hFind, &fd));
		
		::FindClose (hFind);

		m_pSelectedFolder->SetReady(0);

		pFolder = m_pSelectedFolder;
	}

	// Sort the folder list and insert into the chart control
	if ((!pFolder->m_bSorted) && (pFolder->IsReady()))
	{
		if (pFolder->m_arraySubFolder.GetSize() > 1)
			qsort((void*)(pFolder->m_arraySubFolder.GetData()), 
				((size_t)pFolder->m_arraySubFolder.GetSize()), 
				sizeof(pFolder->m_arraySubFolder.GetAt(0)),
				CompareFolderSize);
		pFolder->m_bSorted = TRUE;
	}

	// Insert to the chart controll
	long nCount = pFolder->GetFolderCount(FALSE, FALSE);
	long double ldTotalSize = pFolder->GetFolderSize(TRUE);
	CMyFolder* pSubFolder;
	int nAngle;
	int nTotalAngle = 0;
	int iColor = 0;

	if (nCount == 0)
		nTotalAngle = 360;
	else
	{
		double dAngleTemp;
		for (int i=0; i<nCount; i++)
		{
			iColor = i;
			while (iColor >= MAX_COLOR)
				iColor -= MAX_COLOR;
			pSubFolder = pFolder->GetAt(i);
			dAngleTemp = (((pSubFolder->GetFolderSize(TRUE))/ldTotalSize)*((double)360));
			nAngle = (int)dAngleTemp;
			if (dAngleTemp>=((double)nAngle+0.5))
				nAngle+=1;

			if (nAngle > 10)
			{
				m_wndChart.AddPiece(backColors[iColor], textColors[iColor], nAngle);
				nTotalAngle += nAngle;
			}
			else
				break;
		}
	}

	if (nTotalAngle < 360)
	{
		//iColor ++;
		if (iColor >= MAX_COLOR)
			iColor = MAX_COLOR-1;

		nAngle = 360 - nTotalAngle;
		m_wndChart.AddPiece(backColors[iColor], textColors[iColor], nAngle);
	}
	
	m_wndChart.InvalidateRect(NULL, FALSE);

	int nChartItemCount = m_wndChart.GetItemCount();

	// Insert to chart info list
	{
		int nCount = pFolder->GetCount();
		
		for (int i=0; i<nCount; i++)
		{
			LV_ITEM lvi;
			lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; 
			lvi.iItem = 0; 
			lvi.iSubItem = 0; 
			lvi.iImage = (i > nChartItemCount-1)? nChartItemCount-1:i % MAX_COLOR; //pFile->m_bSelected?1:0;
			lvi.pszText = LPSTR_TEXTCALLBACK; 
			lvi.lParam = (LPARAM) pFolder->GetAt(i);
			
			m_wndChartInfo.InsertItem (&lvi);
		}
	}

	CDetailView::m_bChartInfoSortAscending = FALSE;
	m_nSortedCol = 1;
	m_wndChartInfo.SortItems (CompareFunc, m_nSortedCol);

	// UpdateInfoCtrl
	CString str;
	str.LoadString(IDS_FILES);
	m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILECOUNT, pFolder->GetItemText(3) + " " + str, -1, 1);
	str.LoadString(IDS_FOLDERS);
	m_wndInfo.SetValue(IDS_INFO_CONTAINS_FOLDERCOUNT, pFolder->GetItemText(2) + " " + str, -1, 1);
	m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILESIZE, pFolder->GetItemText(1), -1, 1);

	m_wndInfo.UpdateCtrl();
}

void CDetailView::OnGetdispFolderChartList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
	CMyFolder* pFileItem= (CMyFolder*) pDispInfo->item.lParam;
	LV_ITEM *pItem = &((LV_DISPINFO*)pNMHDR)->item;

	if (pItem->mask & LVIF_TEXT)
	{
		::lstrcpy (pDispInfo->item.pszText, (LPCTSTR) pFileItem->
			GetItemText(pDispInfo->item.iSubItem));
	}

	*pResult = 0;
}

void CDetailView::OnColumnclickChartList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	CWaitCursor wait;

	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

	if( pNMListView->iSubItem == m_nSortedCol )
		CDetailView::m_bChartInfoSortAscending = !CDetailView::m_bChartInfoSortAscending;
	else
		CDetailView::m_bChartInfoSortAscending = TRUE;
	m_nSortedCol = pNMListView->iSubItem;

	m_wndFlatHeader.SetSortColumn(pNMListView->iSubItem, CDetailView::m_bChartInfoSortAscending);

	m_wndChartInfo.SortItems (CompareFunc, pNMListView->iSubItem);
	
	*pResult = 0;
}

void CDetailView::OnChangedTreeFolder(WPARAM wParam, LPARAM lParam)
{
	if (wParam) // Tell me that the scan is finished
	{
		// Update the all info ctrl
		m_bScanFinished = TRUE;

		m_wndInfo.ResetDriveValues();
		m_wndInfo.ResetRootValues();
		CString str;
		CMyFolder* pRootFolder = m_wndDiskTree.GetRootItem()->m_lpNodeInfo->m_pFolder;

		CString strCurrent;
		strCurrent = pRootFolder->GetItemText(0);
		m_wndInfo.m_strFolderTitle = strCurrent;
		double dAllocated = 100;
		
		
		if (strCurrent.GetLength()<=3) // Drive
		{
			CString strTemp;
			// Spaces
			DWORD dwFreeSpaceLow;
			DWORD dwFreeSpaceHigh;
			DWORD dwTotalSpaceLow;
			DWORD dwTotalSpaceHigh;
			if (GetHDSpace(strCurrent, dwFreeSpaceLow, dwFreeSpaceHigh,
				dwTotalSpaceLow, dwTotalSpaceHigh))
			{
				double ldTotal = ((long double)dwTotalSpaceHigh)*
					MAX_DWORD_VALUE + (long double)dwTotalSpaceLow;
				double ldFree = ((long double)dwFreeSpaceHigh) * 
					MAX_DWORD_VALUE + (long double)dwFreeSpaceLow;
				
				FormatByteSize(ldTotal, strTemp);
					
				// Total
				m_wndInfo.SetValue(IDS_INFO_DISK_TOTALSPACE, strTemp, -1, 2);
					
				// Usage
				m_wndInfo.SetValue(IDS_INFO_DISK_USAGE, "", (int)(((ldTotal-ldFree)/ldTotal)*100), 2);			

				dAllocated = ldTotal-ldFree;
			}
			// Allocated
			FormatByteSize(dAllocated, strTemp);
			m_wndInfo.SetValue(IDS_INFO_ALLOCATED, strTemp, -1, 2);

			m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILESIZE, pRootFolder->GetItemText(1), -1, 2);
			m_wndInfo.SetValue(IDS_INFO_EFFICIENCY, "", (int)(pRootFolder->GetFolderSize(TRUE)*100/dAllocated), 2);
		}else
		{
			m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILESIZE, pRootFolder->GetItemText(1), -1, 2);
			str.LoadString(IDS_FILES);
			m_wndInfo.SetValue(IDS_INFO_CONTAINS_FILECOUNT, pRootFolder->GetItemText(3) + " " + str, -1, 2);
			str.LoadString(IDS_FOLDERS);
			m_wndInfo.SetValue(IDS_INFO_CONTAINS_FOLDERCOUNT, pRootFolder->GetItemText(2) + " " + str, -1, 2);
		}
	}

	CMyFolder* pFolder = m_wndDiskTree.GetSelectedFolder();

	UpdateFolderChart(pFolder);
}

BOOL CInfoCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	SetCursor(LoadCursor(NULL, IDC_ARROW));

	return TRUE;
}

void CInfoCtrl::InsertColumn(UINT nID, CInfoCtrlItemArray* pArray)
{
	CInfoCtrlItem* pItem = new CInfoCtrlItem;
	pItem->m_nITEMID = nID;
	pItem -> m_strItemName.LoadString(nID);
	pItem -> m_strItemName += ":";
	pItem -> m_nPercentData = -1; // = -1 if the item contains text data
	pItem -> m_strTextData = _T("");

	try 
	{
		pArray->Add(pItem);
		return;
	}
	catch (CMemoryException* e)
	{
		CString strTemp, strMes;
		strTemp.LoadString(IDS_ERR_OUTOFMEM);
		strMes.Format(strTemp, 3431);
		AfxMessageBox(strMes);

		if (pItem !=NULL) 
			delete pItem;
		e->Delete();
		return;
	}
	return;
}


void CInfoCtrl::ResetInfoValues()
{
	int nCount = m_arrayInfoItem.GetSize();
	CInfoCtrlItem* pItem;
	
	for (int i = 0; i < nCount; i++)
	{
		pItem = m_arrayInfoItem.GetAt(i);

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

void CInfoCtrl::ResetRootValues()
{
	CInfoCtrlItem* pItem;
	
	int nCount = m_arrayRootItem.GetSize();
	for (int i = 0; i < nCount; i++)
	{
		pItem = m_arrayRootItem.GetAt(i);

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


}
void CInfoCtrl::SetValue(UINT nID, const CString &str, int n, int nArray)
{
	CInfoCtrlItemArray* pCurArray;
	
	if (nArray == 0)
		pCurArray = &m_arrayDiskInfo;
	else if (nArray == 1)
		pCurArray = &m_arrayInfoItem;

⌨️ 快捷键说明

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