📄 blockinfoview.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 + -