📄 disklistctrl.cpp
字号:
// 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 + -