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

📄 disklistctrl.cpp

📁 磁盘容量扫描、但界面和程序结构非常不错
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// DiskListCtrl.cpp : implementation file
// BY Yuheng Zhao 1999-1
// 
// To optimize
// Improve HitTestEx(..)
// Save ClientRect

#include "stdafx.h"
#include "diskinfo.h"
#include "DiskListCtrl.h"

#include "Common/Useful.h"
#include "Common/memDC.h"
#include "Common/DrawEx.h"


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

int CDiskListCtrl::m_nSortCode;
/////////////////////////////////////////////////////////////////////////////
// CDiskListCtrl

CDiskListCtrl::CDiskListCtrl()
{
	m_nMouseInCode = 1000; //0-n buttons -1 - -6 title bar
	m_nMouseDownCode = 1000;
	m_bMouseDown = FALSE;
	m_nSortCode = -100;

	m_nNrThread = 0;
}

CDiskListCtrl::~CDiskListCtrl()
{
	DeleteAll();
}


BEGIN_MESSAGE_MAP(CDiskListCtrl, CWnd)
//{{AFX_MSG_MAP(CDiskListCtrl)
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_WM_SETCURSOR()
	ON_WM_CREATE()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_DISKLIST_UPDATE, OnItemUpdate)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CDiskListCtrl message handlers

BOOL CDiskListCtrl::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	static CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);

	return  CWnd::CreateEx(NULL, ///*WS_EX_CLIENTEDGE  WS_EX_STATICEDGE, 
		className, NULL, dwStyle, 
		rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
		pParentWnd->GetSafeHwnd(), (HMENU) nID);
}

CDiskListCtrl::CItemInfo::CItemInfo(CDiskListCtrl* pCtrl)
{
	m_pCtrl = pCtrl;
	Reset();
}

CDiskListCtrl::CItemInfo::~CItemInfo()
{
	StopThread();
	
}

BOOL CDiskListCtrl::CItemInfo::Update()
{
	BOOL bChanged = FALSE;
	
	m_nDriveType = ::GetDriveType((LPCTSTR)m_strDriveName);
	
	CString strTemp;
	char driveName[32];
	char driveType[32];
	DWORD dwDword1, dwDword2, dwDword3;
	if (::GetVolumeInformation(
		m_strDriveName,
		driveName, 32, &dwDword1, &dwDword2, &dwDword3,
		driveType, 32))
	{
		if (!m_bAvailable)
		{
			m_bAvailable = TRUE;
			bChanged = TRUE;
		}
		
		strTemp = driveName;
		strTemp.MakeLower();
		strTemp = strTemp.Right(strTemp.GetLength()-1);
		strTemp = CString(driveName).Left(1) + strTemp;
		strTemp += " (" + m_strDriveName.Left(m_strDriveName.GetLength()-1) + ")";
		
		if (strTemp != m_strTitle)
		{
			m_strTitle = strTemp;
			bChanged = TRUE;
		}
		
		//Type
		strTemp = driveType;
		if (strTemp.CompareNoCase(_T("FAT")) == 0)
			strTemp = _T("FAT16");
		if (strTemp != m_strPartitionType)
		{
			m_strPartitionType = strTemp;
			bChanged = TRUE;
		}
	}else
	{
		if (m_nDriveType == DRIVE_REMOVABLE || m_nDriveType == 
			DRIVE_REMOTE || m_nDriveType == DRIVE_CDROM)
		{
			if (m_bAvailable != FALSE)
			{
				m_bAvailable = FALSE;
				bChanged = TRUE;
			}
		}else
		{
		/*
		LPVOID lpMsgBuf;
		
		  FormatMessage(
		  FORMAT_MESSAGE_ALLOCATE_BUFFER |
		  FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
		  NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL,
		  SUBLANG_DEFAULT), // Default language
		  (LPTSTR) &lpMsgBuf, 0, NULL );// Process any inserts in lpMsgBuf.
		  
			CString strError(m_strDriveName + "..." + CString((LPCSTR)lpMsgBuf));
			CFunctionLog log(strError, 5);
			//MessageBox( NULL, lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
			/// Free the buffer.
			LocalFree( lpMsgBuf );*/
		}		
	}
	
	
	if (m_bAvailable)
	{
		// Spaces
		DWORD dwFreeSpaceLow;
		DWORD dwFreeSpaceHigh;
		DWORD dwTotalSpaceLow;
		DWORD dwTotalSpaceHigh;
		if (GetHDSpace(m_strDriveName, 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;
			
			// Total
			if (ldTotal != m_ldTotalSpace)
			{
				m_ldTotalSpace = ldTotal;
				bChanged = TRUE;
			}
			
			// Free
			if (ldFree != m_ldFreeSpace)
			{
				m_ldFreeSpace = ldFree;
				bChanged = TRUE;
			}
		}
	}
	
	return bChanged;
	
}

BOOL CDiskListCtrl::AddDrive(const CString &str)
{
	CItemInfo* pItem = new CItemInfo(this);
	pItem->m_strDriveName = str;

	try 
	{
		m_arrayDrive.Add(pItem);
		return TRUE;
	}
	catch (CMemoryException* e)
	{
		CString strTemp, strMes;
		strTemp.LoadString(IDS_ERR_OUTOFMEM);
		strMes.Format(strTemp, 2012);
		AfxMessageBox(strMes);

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

BOOL CDiskListCtrl::AddFolder(const CString &str)
{
	CItemInfo* pItem = new CItemInfo(this);
	pItem->m_strDriveName = str;
	if (str.Right(1)!="\\")
		pItem->m_strDriveName += "\\";	

	try 
	{
		m_arrayFolder.Add(pItem);
		return TRUE;
	}
	catch (CMemoryException* e)
	{
		CString strTemp, strMes;
		strTemp.LoadString(IDS_ERR_OUTOFMEM);
		strMes.Format(strTemp, 2012);
		AfxMessageBox(strMes);

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

void CDiskListCtrl::CItemInfo::Reset()
{
	m_bAvailable = FALSE;
	m_nDriveType = -1;
	m_strDriveName = _T("");
	m_strTitle = _T("");
	m_strPartitionType = _T("");

	m_nFileCount = -1;
	m_nFolderCount = 0;
	m_ldTotalSpace = 0;	// Numbers of files in folder mode
	m_ldFreeSpace = 0;	// Numbers of folders in folder mode

	m_pThread = NULL;
	m_nThreadCode = 1;
}

void CDiskListCtrl::DeleteAll()
{
	int nCount = m_arrayDrive.GetSize();
	
	for (int i = 0; i < nCount; i++)
		delete m_arrayDrive.GetAt(i);

	m_arrayDrive.RemoveAll();

	EmptyFolderArray();
}

void CDiskListCtrl::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	CRect rcClient;
	GetClientRect(&rcClient);
	CRect rcItem;

	COLORREF colorFace = GetSysColor(COLOR_BTNFACE);
	COLORREF colorShadow = GetSysColor(COLOR_3DSHADOW);
	COLORREF colorLight = GetSysColor(COLOR_3DHILIGHT);

	CMemDC dcMem(&dc);


	BOOL bUseBmp = FALSE;
	if (m_bEnableBackground)
	{
		// Check system color >16 bit
		bUseBmp = TRUE; //Update later
	}

	CFont* pFont = CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT));
	CString strText;
	//CFont* pOldFont = dcMem.SelectObject(&m_fontTitle);
	CFont* pOldFont = dcMem.SelectObject(pFont);
	COLORREF oldTextColor = dcMem.SetTextColor(RGB(0,0,0));
	int oldBkMod = dcMem.SetBkMode(TRANSPARENT);

	int nDriveSize = GetDriveSize();
	int nFolderSize = GetFolderSize();
	if (nDriveSize != 0)
	{
		// Title 
		GetItemRect(rcClient, rcItem, -1, -1);
		dcMem.FillSolidRect(rcItem, colorFace);
		
		// Paint title Text
		for (int i=1; i<7;i++)
		{
			GetItemRect(rcClient, rcItem, -1, i);
			
			switch (i)
			{
			case 1:
				strText.LoadString(IDS_TITLE);
				//rectText.left -= 20;
				break;
			case 2:
				strText.LoadString(IDS_TYPE);
				break;
			case 3:
				strText.LoadString(IDS_TOTAL);
				break;
			case 4:
				strText.LoadString(IDS_USAGE);			
				break;
			case 5:
				strText.LoadString(IDS_USED);
				break;
			case 6:
				strText.LoadString(IDS_FREE);
				break;
			}
			
			if (i == -m_nMouseInCode && (m_nMouseDownCode>=1000 || m_nMouseDownCode == m_nMouseInCode))
				dcMem.SetTextColor(RGB(0,0,128));
			
			dcMem.DrawText(strText, rcItem, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
			
			if (i == -m_nMouseInCode && (m_nMouseDownCode>=1000 || m_nMouseDownCode == m_nMouseInCode))
			{
				dcMem.SetTextColor(RGB(0,0,0));
				if (m_bMouseDown)
					dcMem.Draw3dRect(rcItem, colorShadow, colorLight);
				else
					dcMem.Draw3dRect(rcItem, colorLight, colorShadow);
			}
		}	
	}

	// Drive Buttons
	GetItemRect(rcClient, rcItem, -2, -1);
	if (bUseBmp && !m_bmpDriveBack.IsEmpty())
		m_bmpDriveBack.FillDIB(&dcMem, rcItem);
	else
		dcMem.FillSolidRect(rcItem, colorLight);

	GetItemRect(rcClient, rcItem, -2, 6);
	if (bUseBmp && !m_bmpFreeBack.IsEmpty())
		m_bmpFreeBack.FillDIB(&dcMem, rcItem);
	else
		dcMem.FillSolidRect(rcItem, colorFace);

	//GetItemRect(rcClient, rcItem, -3, 6);
	//dcMem.FillSolidRect(rcItem, colorFace);

	// Folder buttons
	GetItemRect(rcClient, rcItem, -4, -1);
	if (bUseBmp && !m_bmpFolderBack.IsEmpty())
		m_bmpFolderBack.FillDIB(&dcMem, rcItem);
	else
		dcMem.FillSolidRect(rcItem, colorLight);

	// High light
	if (m_nMouseInCode>=0 && m_nMouseInCode<1000 &&
		(m_nMouseDownCode>=1000 || m_nMouseDownCode == m_nMouseInCode))
	{
		GetItemRect(rcClient, rcItem, m_nMouseInCode, -1);
		if (m_bMouseDown)
		{
			if (bUseBmp && !m_bmpPressedBack.IsEmpty())
				m_bmpPressedBack.FillDIB(&dcMem, rcItem);
			else
				dcMem.FillSolidRect(rcItem, colorFace);
			
			dcMem.Draw3dRect(rcItem, colorShadow, colorLight);
		}else
		{
			if (bUseBmp && !m_bmpHighBack.IsEmpty())
				m_bmpHighBack.FillDIB(&dcMem, rcItem);
			else
				dcMem.FillSolidRect(rcItem, colorFace);
			
			dcMem.Draw3dRect(rcItem, colorLight, colorShadow);
		}
	}

	// Border
	GetItemRect(rcClient, rcItem, -5, -1);
	dcMem.Draw3dRect(rcItem, colorShadow, colorLight);

	// Total info Button
	if (nDriveSize != 0)
	{
		GetItemRect(rcClient, rcItem, -3, -1);
		rcItem.InflateRect(1,0);
		if (nFolderSize == 0)
			rcItem.bottom ++;
		if (bUseBmp && !m_bmpTotalBack.IsEmpty())
			m_bmpTotalBack.FillDIB(&dcMem, rcItem);
		else
			dcMem.FillSolidRect(rcItem, colorFace);
		rcItem.DeflateRect(2,0);
		if (nFolderSize != 0)
			dcMem.DrawEdge(rcItem, BDR_RAISEDINNER, BF_BOTTOM|BF_TOP);
		else
			dcMem.DrawEdge(rcItem, BDR_RAISEDINNER, BF_TOP);
	}

	

	for (int i = 0; i < nDriveSize; i++)
		DrawDrive(&dcMem, rcClient, i);

	for (i = 0; i < nFolderSize; i++)
		DrawFolder(&dcMem, rcClient, i);

	//pFont = CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FONT));
	//dcMem.SelectObject(pFont);
	dcMem.SetTextColor(RGB(0,0,128));

	if (nDriveSize != 0)
		DrawTotalItem(&dcMem, rcClient);

	dcMem.SelectObject(pOldFont);		
	dcMem.SetTextColor(oldTextColor);
	dcMem.SetBkMode(oldBkMod);
}

BOOL CDiskListCtrl::OnEraseBkgnd(CDC* pDC) 
{
	return TRUE;
}

void CDiskListCtrl::GetItemRect(const CRect &rcClient, 
								CRect &rc, int nType, int nPos)
{
	// nType -1 = titlebar
	// nType -2 = All Drivebuttons
	// nType -3 = total info button
	// nType -4 = All folderbuttons
	// nType -5 = Border rect
	// nType 0- = for button number

	CRect rcC(rcClient);
	rcC.DeflateRect(1,1,1,1);
	rc = rcC;
	int nDriveSize = GetDriveSize();

	int nHeight = GetItemHeight(rcClient);
	int nTitleHeight = GetItemHeight(rcClient, TRUE);

	switch (nType)
	{
	case -1:
		rc.top = 0;
		rc.bottom = nTitleHeight;
		rc.left -= 1;
		rc.right += 1;
		break;
	case -2:
		rc.top = nTitleHeight + 1; // Plus border
		rc.bottom = rc.top + nHeight*nDriveSize;
		break;
	case -3:
		rc.top = nTitleHeight + 1 + nHeight*nDriveSize; // Plus border
		rc.bottom = rc.top + nHeight;

		rc.left -= 1;

⌨️ 快捷键说明

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