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