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

📄 blockinfoview.cpp

📁 类似Linux操作系统0.11版文件系统的文件系统设计和Windows下的操作程序
💻 CPP
字号:
// SystemInfoView.cpp : 实现文件
//

#include "stdafx.h"
#include "ULExplorer.h"
#include "BlockInfoView.h"
#include ".\blockinfoview.h"

extern int test_bit(unsigned short bitnr, char *addr);
extern void get_zmap(char *pmap);
// CSystemInfoView

IMPLEMENT_DYNCREATE(CBlockInfoView, CScrollView)

CBlockInfoView::CBlockInfoView()
{
	m_bShowBlock = FALSE;
}

CBlockInfoView::~CBlockInfoView()
{
}

BEGIN_MESSAGE_MAP(CBlockInfoView, CScrollView)
	ON_WM_ERASEBKGND()
	ON_WM_SIZE()
END_MESSAGE_MAP()


// CSystemInfoView 绘图

void CBlockInfoView::OnDraw(CDC* pDC)
{
	if (m_bShowBlock)
		DrawBlocks(pDC);

	/*
	if (XTPPaintManager()->GetCurrentTheme() == xtpThemeOffice2003)
	{
	pDC->Draw3dRect(CXTPClientRect(this), GetXtremeColor(XPCOLOR_FRAME), GetXtremeColor(XPCOLOR_FRAME));
	}
	else
	{
	pDC->Draw3dRect(CXTPClientRect(this), GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DHIGHLIGHT));
	}
	*/
}

void CBlockInfoView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CSize sizeTotal;
	// TODO: 计算此视图的合计大小
	sizeTotal.cx  = 0;
	sizeTotal.cy = 0;
	CScrollView::SetScrollSizes(MM_TEXT, sizeTotal);
}


// CSystemInfoView 诊断

#ifdef _DEBUG
void CBlockInfoView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CBlockInfoView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}
#endif //_DEBUG


// CSystemInfoView 消息处理程序

void CBlockInfoView::DrawBlocks(CDC* pDC)
{
	COLORREF ColorBoot = RGB(242, 108, 78);
	COLORREF ColorSuper = RGB(255, 149, 255);
	COLORREF ColorIMap = RGB(255, 0, 255);
	COLORREF ColorZMap = RGB(255, 255, 0);
	COLORREF ColorInode = RGB(25, 148, 55);
	COLORREF ColorEmpty = RGB(161, 200, 255);
	COLORREF ColorUsed = RGB(79, 145, 255);

	CPen Pen(PS_SOLID, 1, RGB(255,255,255));
	CPen* OldPen = pDC->SelectObject(&Pen);
	// 边框
	register x=0, y=0;
	int width = m_BlocksPerLine * BLOCK_WIDTH;
	for (int i=0; i<m_BlockLines+1; i++, y+=BLOCK_HEIGHT) 
	{
		pDC->MoveTo(x, y);
		pDC->LineTo(x+width, y);
	}

	x=0, y=0;
	int height = m_BlockLines * BLOCK_HEIGHT;
	for (i=0; i<m_BlocksPerLine+1; i++, x+=BLOCK_WIDTH) 
	{
		pDC->MoveTo(x, y);
		pDC->LineTo(x, y+height);
	}
	// 图块
	int j=0, idx=0;
	x=1, y=1;
	for (i=0; i<m_BlockLines; i++, y+=BLOCK_HEIGHT)
	{
		for (j=0; j<m_BlocksPerLine; j++, x+=BLOCK_WIDTH) 
		{
			// Boot
			if (idx==0) 
			{
				pDC->FillSolidRect(x, y, BLOCK_WIDTH-1, BLOCK_HEIGHT-1, ColorBoot);
			}
			else if (idx==1) 
			{
				pDC->FillSolidRect(x, y, BLOCK_WIDTH-1, BLOCK_HEIGHT-1, ColorSuper);
			}
			else if (idx<m_Super.s_imap_blocks+2)
			{
				pDC->FillSolidRect(x, y, BLOCK_WIDTH-1, BLOCK_HEIGHT-1, ColorIMap);
			}
			else if (idx<m_Super.s_zmap_blocks+m_Super.s_imap_blocks+2)
			{
				pDC->FillSolidRect(x, y, BLOCK_WIDTH-1, BLOCK_HEIGHT-1, ColorZMap);
			}
			else if (idx<m_Super.s_firstdatazone)
			{
				pDC->FillSolidRect(x, y, BLOCK_WIDTH-1, BLOCK_HEIGHT-1, ColorInode);
			}
			else
			{
				if ( test_bit(idx-m_Super.s_firstdatazone, m_zmap)) 
					pDC->FillSolidRect(x, y, BLOCK_WIDTH-1, BLOCK_HEIGHT-1, ColorUsed);
				else
					pDC->FillSolidRect(x, y, BLOCK_WIDTH-1, BLOCK_HEIGHT-1, ColorEmpty);
				
			}
			idx++;
			if (idx>=m_TotalBlocks)
				return;
		}
		x = 1;
	}
	pDC->SelectObject(OldPen);
}

void CBlockInfoView::SetScrollSizes()
{
	if ( !m_bShowBlock )
		return;

	CRect rcClient, rcMap;
	GetClientRect(&rcClient);
	GetClientRect(&rcMap);

	rcMap.bottom = m_BlockLines*BLOCK_HEIGHT;	

	CSize szTotal = rcMap.Size();
	CSize szPage = rcClient.Size();

	CSize szLine = szPage;
	szLine.cx /= 10;
	szLine.cy /= 10;

	CScrollView::SetScrollSizes(MM_TEXT, szTotal, szPage, szLine);
	Invalidate();
}


BOOL CBlockInfoView::OnEraseBkgnd(CDC* pDC)
{
	BOOL ret = CScrollView::OnEraseBkgnd(pDC);
	return ret;
}

void CBlockInfoView::OnSize(UINT nType, int cx, int cy)
{
	CScrollView::OnSize(nType, cx, cy);
	ShowBlockBitmap();
}

void CBlockInfoView::ShowBlockBitmap(void)
{
	if (!theFileSys.IsVDiskLoaded())
		return;
	m_TotalBlocks = theFileSys.GetTotalBlocks();
	CRect rcClient;
	GetClientRect(&rcClient);
	m_BlocksPerLine = rcClient.Width() / BLOCK_WIDTH;
	if (!m_BlocksPerLine) 
		return;
	m_BlockLines = m_TotalBlocks / m_BlocksPerLine;
	if ( m_TotalBlocks % m_BlocksPerLine)
		m_BlockLines++;

	m_bShowBlock = TRUE;

	m_Super = theFileSys.GetSuper();
	get_zmap(m_zmap);

	CRect rcMap;
	GetClientRect(&rcMap);

	rcMap.bottom = m_BlockLines*BLOCK_HEIGHT;	

	CSize szTotal = rcMap.Size();
	CSize szPage = rcClient.Size();

	CSize szLine = szPage;
	szLine.cx /= 10;
	szLine.cy /= 10;

	CScrollView::SetScrollSizes(MM_TEXT, szTotal, szPage, szLine);

	SetScrollSizes();
};

void CBlockInfoView::ClearAll(void)
{
	m_bShowBlock = FALSE;
	Invalidate();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -