📄 detailview.cpp
字号:
// DetailView.cpp : implementation of the CDetailView class
//
#include "stdafx.h"
#include "DiskInfo.h"
#include "DetailView.h"
#include "Common/dirdialog.h"
#include "Common/DrawEx.h"
#include "Common/Useful.h"
#include "Common/makehtml.h"
#include "PreviewEx.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "Common\MemDC.h"
const int nHeaderWidth = 22;
const int nMargin = 5;
#ifndef MAX_COLOR
#define MAX_COLOR 15
const static COLORREF backColors[MAX_COLOR] =
{
RGB(0,0,255),
RGB(255,0,255),
RGB(0,128,0),
RGB(255,0,0),
RGB(128,128,128),
RGB(0,255,255),
RGB(0,0,128),
RGB(255,255,255),
RGB(128,0,128),
RGB(0,255,0),
RGB(128,0,0),
RGB(255,255,0),
RGB(0,128,128),
RGB(128,128,0),
RGB(192,192,192),
};
const static COLORREF textColors[MAX_COLOR] =
{
RGB(255,255,255),
RGB(255,255,255),
RGB(0,0,0),
RGB(255,255,255),
RGB(0,0,0),
RGB(0,0,0),
RGB(255,255,255),
RGB(255,255,255),
RGB(255,255,255),
RGB(255,255,255),
RGB(255,255,255),
RGB(255,255,255),
RGB(255,255,255),
RGB(0,0,0),
RGB(0,0,0),
};
#endif
BOOL CDetailView::m_bChartInfoSortAscending = FALSE;
/////////////////////////////////////////////////////////////////////////////
// CInfoCtrl
CInfoCtrl::CInfoCtrl()
{
}
CInfoCtrl::~CInfoCtrl()
{
int nCount = m_arrayInfoItem.GetSize();
for (int i = 0; i < nCount; i++)
delete m_arrayInfoItem.GetAt(i);
m_arrayInfoItem.RemoveAll();
nCount = m_arrayDiskInfo.GetSize();
for (i = 0; i < nCount; i++)
delete m_arrayDiskInfo.GetAt(i);
m_arrayDiskInfo.RemoveAll();
nCount = m_arrayRootItem.GetSize();
for (i = 0; i < nCount; i++)
delete m_arrayRootItem.GetAt(i);
m_arrayRootItem.RemoveAll();
}
BEGIN_MESSAGE_MAP(CInfoCtrl, CWnd)
//{{AFX_MSG_MAP(CInfoCtrl)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_SETCURSOR()
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInfoCtrl message handlers
BOOL CInfoCtrl::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);
}
BOOL CInfoCtrl::OnEraseBkgnd(CDC* pDC)
{
return true;
}
#define _N_ITEMHEIGHT_ 17
void CInfoCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect(&rcClient);
COLORREF colorFace = GetSysColor(COLOR_BTNFACE);
COLORREF colorShadow = GetSysColor(COLOR_3DSHADOW);
COLORREF colorLight = GetSysColor(COLOR_3DHILIGHT);
CMemDC dcMem(&dc);
dcMem.FillSolidRect(rcClient, colorFace);
//CFont* pFont = CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT));
CFont* pOldFont = dcMem.SelectObject(&m_font);
COLORREF oldTextColor = dcMem.SetTextColor(RGB(0,0,0));
int oldBkMod = dcMem.SetBkMode(TRANSPARENT);
int nLength = DrawItemArray(&dcMem, rcClient, 0);
rcClient.top += nLength + ((nLength)?3:0);
nLength = DrawItemArray(&dcMem, rcClient, 2);
rcClient.top += nLength + ((nLength)?3:0);
DrawItemArray(&dcMem, rcClient, 1);
dcMem.Draw3dRect(rcClient, colorShadow, colorLight);
dcMem.SelectObject(pOldFont);
dcMem.SetTextColor(oldTextColor);
dcMem.SetBkMode(oldBkMod);
}
/////////////////////////////////////////////////////////////////////////////
// CDetailView
CDetailView::CDetailView()
{
m_nInfoWidth = 140;
m_nInfoHeight = 140;
m_bVerMode = TRUE;
m_nMouseInCode = 1000; // 0 = title button
m_bMouseDown = FALSE;
m_bFirstTime = TRUE;
m_bShowChart = TRUE;
m_bShowInfo = TRUE;
m_pSelectedFolder = NULL;
m_bSelectedIsFile = FALSE;
m_nSortedCol = -1;
m_bScanFinished = FALSE;
}
CDetailView::~CDetailView()
{
if (m_bSelectedIsFile && m_pSelectedFolder)
delete m_pSelectedFolder;
m_pSelectedFolder = NULL;
}
BEGIN_MESSAGE_MAP(CDetailView,CView )
//{{AFX_MSG_MAP(CDetailView)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_TIMER()
ON_WM_LBUTTONUP()
ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop)
ON_NOTIFY(LVN_GETDISPINFO, ID_CHART_INFO, OnGetdispFolderChartList)
ON_NOTIFY(LVN_COLUMNCLICK, ID_CHART_INFO, OnColumnclickChartList)
ON_MESSAGE(WM_FOLDER_SELECTED, OnChangedTreeFolder)
ON_COMMAND(ID_SHOWCHART, OnShowChart)
ON_UPDATE_COMMAND_UI(ID_SHOWCHART, OnUpdateShowChart)
ON_COMMAND(ID_SHOWINFO, OnShowInfo)
ON_UPDATE_COMMAND_UI(ID_SHOWINFO, OnUpdateShowInfo)
ON_COMMAND(ID_FILE_SELECT, OnFileSelect)
ON_UPDATE_COMMAND_UI(ID_RESCAN, OnUpdateRescan)
ON_UPDATE_COMMAND_UI(ID_FILE_SELECT, OnUpdateFileSelect)
ON_WM_DESTROY()
ON_COMMAND(ID_SAVE_RESULT, OnSaveResult)
ON_COMMAND(ID_COLLAPSEALL, OnCollapseAll)
ON_COMMAND(ID_EXPANDALL, OnExpandAll)
ON_WM_KEYDOWN()
ON_UPDATE_COMMAND_UI(ID_SAVE_RESULT, OnUpdateSaveResult)
ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateFilePrint)
ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, OnUpdateFilePrintPreview)
ON_COMMAND(ID_STOP, OnStop)
ON_COMMAND(ID_RESCAN, OnRescan)
ON_WM_HELPINFO()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_SPLITWND_HOR, OnSplitWnd)
ON_BN_CLICKED(IDC_SPLITWND_VER, OnSplitWnd)
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnPrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDetailView message handlers
BOOL CDetailView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CView::PreCreateWindow(cs))
return FALSE;
cs.style &= ~WS_BORDER;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
return TRUE;
}
void CDetailView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CMemDC memDC(&dc);
CRect rcClient;
GetClientRect(&rcClient);
COLORREF colorFace = GetSysColor(COLOR_BTNFACE);
COLORREF colorShadow = GetSysColor(COLOR_3DSHADOW);
COLORREF colorLight = GetSysColor(COLOR_3DHILIGHT);
COLORREF colorText = GetSysColor(COLOR_WINDOWTEXT);
memDC.FillSolidRect(rcClient, colorFace);
// Header bar
CRect rcItem(rcClient);
rcItem.bottom = rcItem.top + nHeaderWidth;
memDC.FillSolidRect(rcItem, colorShadow);
//memDC.DrawEdge(rcItem, EDGE_ETCHED, BF_RECT);
CFont* pOldFont = (CFont*)memDC.SelectObject(&m_fontTitle);
COLORREF oldTextColor;
int oldBkMod = memDC.SetBkMode(TRANSPARENT);
oldTextColor = memDC.SetTextColor(RGB(255,255,255));
rcItem = m_rcTitle;
if (rcItem.right>=rcClient.right)
rcItem.right = rcClient.right-1;
if (m_nMouseInCode == 0)
{
if (m_bMouseDown)
memDC.Draw3dRect(rcItem, RGB(0,0,0), RGB(255,255,255));
else
memDC.Draw3dRect(rcItem, RGB(255,255,255), RGB(0,0,0));
}
rcItem.DeflateRect(5, 0);
rcItem.right -= 12;
::DrawTextEx (memDC.m_hDC,
m_strTitle.GetBuffer (0),
m_strTitle.GetLength(),
&rcItem,
DT_SINGLELINE | DT_VCENTER | DT_LEFT | DT_PATH_ELLIPSIS,
NULL);
// Draw a triangle
rcItem.right += 12;
rcItem.left = rcItem.right-8;
rcItem.top += rcItem.Height() / 2 - 1;
CPoint pt[3];
pt[0] = rcItem.TopLeft();
pt[1] = CPoint(rcItem.right, rcItem.top);
pt[2] = CPoint(rcItem.left + rcItem.Width()/2, rcItem.top + rcItem.Width()/2);
memDC.SelectStockObject(WHITE_BRUSH);
memDC.SelectStockObject(NULL_PEN);
memDC.Polygon( pt, 3 );
/*rcItem = rcClient;
if (m_bVerMode)
{
rcItem.left = rcClient.right - m_nInfoWidth;
rcItem.top += rcItem.Height() / 2;
rcItem.bottom = rcItem.top + nMargin;
memDC.DrawEdge(rcItem, EDGE_ETCHED, BF_BOTTOM);
}
else
{
rcItem.top = rcItem.bottom - m_nInfoHeight;
rcItem.left += rcItem.Width() / 2;
rcItem.right = rcItem.left + nMargin;
memDC.DrawEdge(rcItem, EDGE_ETCHED, BF_RIGHT);
}*/
m_wndDiskTree.GetWindowRect(&rcItem);
ScreenToClient(&rcItem);
rcItem.InflateRect(1,1);
memDC.Draw3dRect(rcItem, colorShadow, colorLight);
if (m_bShowChart)
{
m_wndChartInfo.GetWindowRect(&rcItem);
ScreenToClient(&rcItem);
rcItem.InflateRect(1,1);
memDC.Draw3dRect(rcItem, colorShadow, colorLight);
}
memDC.SelectObject(pOldFont);
memDC.SetTextColor(oldTextColor);
memDC.SetBkMode(oldBkMod);
}
BOOL CDetailView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
int CDetailView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView ::OnCreate(lpCreateStruct) == -1)
return -1;
//, m_wndSplitHor;
LPCSTR lpszClassName = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW);
m_wndSplitVer.Create(lpszClassName,"",WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,IDC_SPLITWND_VER);
m_wndSplitHor.Create(lpszClassName,"",WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,IDC_SPLITWND_HOR);
m_wndSplitHor.m_bVerticle = FALSE;
m_fontTitle.CreateFont(16, 0,0,0,FW_BOLD, 0,0,0,
DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial");
m_wndDiskTree.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, ID_DISK_TREE);
//m_wndDiskTree.ModifyStyleEx(NULL, WS_EX_STATICEDGE, SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER);
//m_wndDiskTree.ModifyStyleEx(NULL, WS_EX_CLIENTEDGE, SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER);
m_wndChart.Create("PIE_CHART_CTRL", NULL, WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, ID_DISK_CHART);
m_wndChartInfo.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT, CRect(0,0,0,0), this, ID_CHART_INFO);
//m_wndChartInfo.ModifyStyleEx(NULL, WS_EX_STATICEDGE, SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER);
m_wndInfo.Create(NULL, NULL, WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this, ID_INFO_CTRL);
m_bShowChart = AfxGetApp()->GetProfileInt("Settings", "ShowChart", TRUE);
m_bShowInfo = AfxGetApp()->GetProfileInt("Settings", "ShowInfoBar", TRUE);
m_nInfoWidth = AfxGetApp()->GetProfileInt("Settings", "InfoWidth", 140);
m_nInfoHeight = AfxGetApp()->GetProfileInt("Settings", "InfoHeight", 90);
UpdateShowInfo();
UpdateShowChart();
//associate imagelist with listviewctrl
HINSTANCE hIns = AfxGetResourceHandle();
AfxSetResourceHandle(AfxGetInstanceHandle());
m_imgColorList.Create(IDB_COLORLIST,16,1,RGB(255, 255, 255));
AfxSetResourceHandle(hIns);
//m_imgColorList.SetBkColor(CLR_NONE);
m_wndChartInfo.SetImageList(&m_imgColorList,LVSIL_SMALL);
if (m_wndFlatHeader.SubclassWindow(m_wndChartInfo.GetDlgItem(0)->GetSafeHwnd()) == 0)
{
TRACE0("Unable to subclass header control.\n");
return -1;
}
LV_COLUMN lvColumn;
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvColumn.fmt = LVCFMT_CENTER;
lvColumn.cx = 150;
CString str;
for(int x = 0; x < 4; x++)
{
str.LoadString(IDS_COL_FOLDERTREE + x);
lvColumn.pszText = (LPTSTR)(LPCTSTR)str;
m_wndChartInfo.InsertColumn(x,&lvColumn);
}
if (IfNewComCtrl32())
{
DWORD dwStyle = ::SendMessage(m_wndChartInfo.m_hWnd,LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
dwStyle |= LVS_EX_GRIDLINES;
::SendMessage(m_wndChartInfo.m_hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
}
return 0;
}
void CDetailView::RepositionCtrls()
{
CRect rcClient;
GetClientRect(&rcClient);
CRect rcItem(rcClient);
rcItem.top += nHeaderWidth + nMargin;
if (m_bVerMode)
{
if (m_bShowChart) rcItem.bottom -= m_nInfoHeight+nMargin;
if (m_bShowInfo) rcItem.right -= m_nInfoWidth + nMargin;
rcItem.DeflateRect(1,1);
m_wndDiskTree.SetWindowPos(NULL, rcItem.left, rcItem.top,
rcItem.Width(), rcItem.Height(), SWP_NOZORDER);
rcItem.InflateRect(1,1);
if (m_bShowInfo)
{
rcItem.right = rcClient.right;
rcItem.left = rcItem.right - m_nInfoWidth;
m_wndInfo.SetWindowPos(NULL, rcItem.left, rcItem.top,
rcItem.Width(), rcItem.Height(), SWP_NOZORDER);
m_wndSplitVer.SetWindowPos(NULL, rcItem.left-nMargin, rcItem.top,
nMargin, (m_bShowChart)?rcItem.Height() + m_nInfoHeight:
rcItem.Height(), SWP_NOZORDER);
}
if (m_bShowChart)
{
rcItem.top = rcItem.bottom+nMargin;
rcItem.bottom += m_nInfoHeight;
rcItem.left = rcClient.left;
m_wndSplitHor.SetWindowPos(NULL, rcItem.left, rcItem.top - nMargin,
rcItem.Width(), nMargin, SWP_NOZORDER);
rcItem.right -= m_nInfoWidth + nMargin;
rcItem.DeflateRect(1,1);
m_wndChartInfo.SetWindowPos(NULL, rcItem.left, rcItem.top,
rcItem.Width(), rcItem.Height(), SWP_NOZORDER);
rcItem.InflateRect(1,1);
rcItem.right = rcClient.right;
rcItem.left = rcItem.right - m_nInfoWidth;
m_wndChart.SetWindowPos(NULL, rcItem.left, rcItem.top,
rcItem.Width(), rcItem.Height(), SWP_NOZORDER);
if (!m_bShowInfo)
m_wndSplitVer.SetWindowPos(NULL, rcItem.left-nMargin, rcItem.top,
nMargin, rcItem.Height(), SWP_NOZORDER);;
}
}
else
{/*
rcItem.bottom -= m_nInfoHeight + nMargin;
m_wndDiskTree.SetWindowPos(NULL, rcItem.left, rcItem.top,
rcItem.Width(), rcItem.Height(), SWP_NOZORDER);
rcItem.bottom = rcClient.bottom;
rcItem.top = rcItem.bottom - m_nInfoHeight;
rcItem.right = rcItem.left + (rcItem.Width() - nMargin) / 2;
m_wndInfo.SetWindowPos(NULL, rcItem.left, rcItem.top,
rcItem.Width(), rcItem.Height(), SWP_NOZORDER);
rcItem.OffsetRect(rcItem.Width() + nMargin, 0);
m_wndChart.SetWindowPos(NULL, rcItem.left, rcItem.top,
rcItem.Width(), rcItem.Height(), SWP_NOZORDER);*/
}
}
void CDetailView::OnSize(UINT nType, int cx, int cy)
{
CView ::OnSize(nType, cx, cy);
RepositionCtrls();
if (m_wndDiskTree.m_hWnd && cx>0)
{
if (m_bFirstTime)
{
AutoResizeColumns();
m_bFirstTime = FALSE;
}//else
//AutoResizeColumns();
//AutoResizeColumns();
}
}
void CDetailView::SetTitle(const CString &str)
{
CRect rcOld = m_rcTitle;
CClientDC dc(this);
CFont* pFont = (CFont*)dc.SelectObject(&m_fontTitle);
m_strTitle = str;
CSize szText = dc.GetTextExtent(m_strTitle);
szText.cx += 22;
szText.cy = nHeaderWidth-2;
m_rcTitle = CRect(CPoint(1, 1), szText);
dc.SelectObject(pFont);
rcOld.UnionRect(rcOld, m_rcTitle);
InvalidateRect(rcOld);
}
void CDetailView::OnMouseMove(UINT nFlags, CPoint point)
{
if (nFlags & MK_LBUTTON)
m_bMouseDown = TRUE;
else
m_bMouseDown = FALSE;
// return;
int nOldCode = m_nMouseInCode;
int nCode = HitTestEx(point);
if (m_nMouseInCode != nCode)
{
int nOld = m_nMouseInCode;
m_nMouseInCode = nCode;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -