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

📄 detailview.cpp

📁 磁盘容量扫描、但界面和程序结构非常不错
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -