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