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

📄 diskutilview.cpp

📁 visual c++ 实例编程
💻 CPP
字号:
// DiskUtilView.cpp : implementation of the CDiskUtilView class
//

#include "stdafx.h"
#include "DiskUtil.h"

#include "DiskUtilDoc.h"
#include "DiskUtilView.h"
#include "General.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CListCtrl *ListView;
extern char TmpStr[];
extern LPBYTE Buffer;
extern int gCurrentIndex, gSectorsPerCluster;
BYTE gListViewType;
char *Months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
BYTE gHexaBytes[50];
extern HMENU Menu;

/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView

IMPLEMENT_DYNCREATE(CDiskUtilView, CListView)

BEGIN_MESSAGE_MAP(CDiskUtilView, CListView)
	//{{AFX_MSG_MAP(CDiskUtilView)
	ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView construction/destruction

CDiskUtilView::CDiskUtilView()
{
	// TODO: add construction code here

}

CDiskUtilView::~CDiskUtilView()
{
}

BOOL CDiskUtilView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	cs.style |= LVS_REPORT | LVS_SHOWSELALWAYS;
	cs.style &= ~LVS_ICON;

	return CListView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView drawing

void CDiskUtilView::OnDraw(CDC* pDC)
{
	CDiskUtilDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

void CDiskUtilView::OnInitialUpdate()
{
	CListView::OnInitialUpdate();

	CListCtrl &ab = GetListCtrl();
	ListView = &ab;
	ab.SetExtendedStyle(LVS_EX_FULLROWSELECT);
	// TODO: You may populate your ListView with items by directly accessing
	//  its list control through a call to GetListCtrl().
}

/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView diagnostics

#ifdef _DEBUG
void CDiskUtilView::AssertValid() const
{
	CListView::AssertValid();
}

void CDiskUtilView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}

CDiskUtilDoc* CDiskUtilView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDiskUtilDoc)));
	return (CDiskUtilDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDiskUtilView message handlers
void CDiskUtilView::OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct)
{
	//TODO: add code to react to the user changing the view style of your window
}

void CDiskUtilView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
	// TODO: Add your control notification handler code here
	DWORD TmpVal;
	TmpStr[0]=0;
	switch(gListViewType)
	{
	case FAT16:
		if(!pDispInfo->item.iSubItem)
			wsprintf(TmpStr, "%08lX", pDispInfo->item.lParam/2);
		else
			wsprintf(TmpStr, "%04X", (WORD) (Buffer[pDispInfo->item.lParam+(pDispInfo->item.iSubItem-1)*2]+
					Buffer[pDispInfo->item.lParam+(pDispInfo->item.iSubItem-1)*2+1]*256));
		break;
	case FAT12:
		if(!pDispInfo->item.iSubItem)
			wsprintf(TmpStr, "%08lX", pDispInfo->item.lParam*16);
		else{
			if(((pDispInfo->item.iSubItem-1)+(pDispInfo->item.lParam*16))%2){		//If it is odd number
				if(pDispInfo->item.iSubItem==16)
					TmpVal=0;
				TmpVal = pDispInfo->item.lParam*24+((pDispInfo->item.iSubItem-1)*3)/2;
				TmpVal = ((WORD)Buffer[TmpVal] + ((WORD)Buffer[TmpVal+1])*256) >> 4;
			}
			else{
				TmpVal = pDispInfo->item.lParam*24+((pDispInfo->item.iSubItem-1)*3)/2;
				TmpVal = ((WORD)Buffer[TmpVal] + (WORD)Buffer[TmpVal+1]*256) & 0xFFF;
			}
			wsprintf(TmpStr, "%03X", TmpVal);
		}
		break;
	case FAT32:
		if(!pDispInfo->item.iSubItem)
			wsprintf(TmpStr, "%08lX", pDispInfo->item.lParam/4);
		else
			wsprintf(TmpStr, "%08X", (DWORD) (((DWORD) Buffer[(DWORD)pDispInfo->item.lParam+(pDispInfo->item.iSubItem-1)*4])+
					((DWORD) Buffer[pDispInfo->item.lParam+((DWORD)pDispInfo->item.iSubItem-1)*4+1]<<8) + ((DWORD) Buffer[pDispInfo->item.lParam+((DWORD)pDispInfo->item.iSubItem-1)*4+2]<<16)
					+ ((DWORD) Buffer[pDispInfo->item.lParam+((DWORD)pDispInfo->item.iSubItem-1)*4+3]<<24)) & 0xFFFFFFF );
		break;
	case SUB_DIR:
	case ROOT_DIR:{
		FILEPACKET *FilePacket = (FILEPACKET *) pDispInfo->item.lParam;
		switch(pDispInfo->item.iSubItem)
		{
		case MS_DOS:
			strcpy(TmpStr, FilePacket->Name);
			break;
		case LFN:
			strcpy(TmpStr, FilePacket->Lfn);
			break;
		case START_CLUS:
			wsprintf(TmpStr, "%08X", FilePacket->StartCluster);
			break;
		case ATTR:
			strcpy(TmpStr, FilePacket->Attributes & ATTR_READ ? "R":"");
			strcat(TmpStr, FilePacket->Attributes & ATTR_HIDDEN ? "H":"");
			strcat(TmpStr, FilePacket->Attributes & ATTR_SYSTEM ? "S":"");
			strcat(TmpStr, FilePacket->Attributes & ATTR_ARCHIVE ? "A":"");
			strcat(TmpStr, FilePacket->Attributes & ATTR_VOLUME ? "V":"");
			strcat(TmpStr, FilePacket->Attributes & ATTR_SUBDIR ? "D":"");
//			if(FilePacket->Name[0] == 0xE5)
//				TmpStr[0]=0;
			strcat(TmpStr, (((BYTE)FilePacket->Name[0] == 0xE5) | (FilePacket->Name[0] == 0x05)) ? "-Deleted":"");
			break;
		case SIZE:
			wsprintf(TmpStr, "%lu", FilePacket->Size);
			break;
		case DATETIME:{
			if(!FilePacket->Date)
				break;
			WORD Year = FilePacket->Date >> 9;
			WORD Month = (FilePacket->Date & 0x1E0) >> 5;
			WORD Day = FilePacket->Date & 0x1F;

			WORD Hour = FilePacket->Time >> 11;
			WORD Minute = (FilePacket->Time & 0x7E0) >> 5;
			WORD Second = (FilePacket->Time & 0x1F) << 1;

			wsprintf(TmpStr, "%u %s %u %u:%02u:%02u", Day, Months[Month-1], Year+1980,  Hour, Minute, Second);
			break;
			}
		case CREATEDATE:{
			if(!FilePacket->CreateDate)
				break;
			WORD Year = FilePacket->CreateDate >> 9;
			WORD Month = (FilePacket->CreateDate & 0x1E0) >> 5;
			WORD Day = FilePacket->CreateDate & 0x1F;

//			WORD Hour = FilePacket->Time >> 11;
//			WORD Minute = (FilePacket->Time & 0x7E0) >> 5;
//			WORD Second = (FilePacket->Time & 0x1F) << 1;

			wsprintf(TmpStr, "%u %s %u", Day, Months[Month-1], Year+1980);
			break;
			}
		case ACCESSDATE:{
			if(!FilePacket->AccessDate)
				break;
			WORD Year = FilePacket->AccessDate >> 9;
			WORD Month = (FilePacket->AccessDate & 0x1E0) >> 5;
			WORD Day = FilePacket->AccessDate & 0x1F;

//			WORD Hour = FilePacket->Time >> 11;
//			WORD Minute = (FilePacket->Time & 0x7E0) >> 5;
//			WORD Second = (FilePacket->Time & 0x1F) << 1;

			wsprintf(TmpStr, "%u %s %u", Day, Months[Month-1], Year+1980);
			break;
			}
		}
		break;
		}
	case FILES_FOLDERS:
	case RAW_DUMP:
	case UNKNOWN:
	case SECTORS_DUMP:
		if(!pDispInfo->item.iSubItem)
			wsprintf(TmpStr, "%08X", pDispInfo->item.lParam*16 + gCurrentIndex * gSectorsPerCluster * 512);
		else{
			if(pDispInfo->item.iSubItem==17)
				break;
			else if(pDispInfo->item.iSubItem>17){
				wsprintf(TmpStr, "%c", Buffer[pDispInfo->item.lParam*16 + pDispInfo->item.iSubItem - 18]);
			}
			else
				wsprintf(TmpStr, "%02X", Buffer[pDispInfo->item.lParam*16 + pDispInfo->item.iSubItem - 1]);
		}
		break;
	}
	pDispInfo->item.pszText = TmpStr;
	*pResult = 0;
}

⌨️ 快捷键说明

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