hexshowdoc.cpp
来自「《突破Visual C++.NET编程实例五十讲+源文件,初学者学习的好东东!」· C++ 代码 · 共 151 行
CPP
151 行
// HexShowDoc.cpp : CHexShowDoc 类的实现
//
#include "stdafx.h"
#include "HexShow.h"
#include "HexShowDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CHexShowDoc
IMPLEMENT_DYNCREATE(CHexShowDoc, CDocument)
BEGIN_MESSAGE_MAP(CHexShowDoc, CDocument)
END_MESSAGE_MAP()
// CHexShowDoc 构造/销毁
CHexShowDoc::CHexShowDoc()
: m_nBytesPerLine(0)
, m_lFileLength(0)
, m_pHexFile(NULL)
{
// TODO:在此添加一次性构造代码
//每行显示16个字节
m_nBytesPerLine = 16;
m_lFileLength = 0L;
m_pHexFile = NULL;
}
CHexShowDoc::~CHexShowDoc()
{
if (m_pHexFile != NULL){
m_pHexFile->Close();
delete m_pHexFile;
m_pHexFile = NULL;
}
}
BOOL CHexShowDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO:在此添加重新初始化代码
// (SDI 文档将重用该文档)
return TRUE;
}
// CHexShowDoc 序列化
void CHexShowDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO:在此添加存储代码
}
else
{
// TODO:在此添加加载代码
}
}
// CHexShowDoc 诊断
#ifdef _DEBUG
void CHexShowDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CHexShowDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
// CHexShowDoc 命令
BOOL CHexShowDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: 在此添加您专用的创建代码
if (m_pHexFile != NULL){
m_pHexFile->Close();
delete m_pHexFile;
}
m_pHexFile = new CFile(lpszPathName,CFile::modeRead|CFile::typeBinary);
if (!m_pHexFile){
AfxMessageBox("文件打开错!");
return FALSE;
}
m_lFileLength = m_pHexFile->GetLength();
return TRUE;
}
BOOL CHexShowDoc::ReadFileAndProcess(CString &strLine, long lOffset)
{
long lPos;
if (lOffset != -1)
lPos = m_pHexFile->Seek(lOffset,CFile::begin);
else
lPos = m_pHexFile->GetPosition();
unsigned char szBuf[16];
int nRet = m_pHexFile->Read(szBuf,m_nBytesPerLine);
if (nRet <= 0)
return FALSE;
CString sTemp;
CString sChars;
sTemp.Format(_T("%8.8X: "),lPos);
strLine = sTemp;
for (int i=0; i<nRet; i++){
if (i == 0)
sTemp.Format(_T("%2.2X"),szBuf[i]);
else if (i % 16 == 0)
sTemp.Format(_T(" %2.2X"),szBuf[i]);
else if (i % 8 == 0)
sTemp.Format(_T(" - %2.2X"),szBuf[i]);
else
sTemp.Format(_T(" %2.2X"),szBuf[i]);
if (_istprint(szBuf[i]))
sChars += szBuf[i];
else sChars += _T('.');
strLine += sTemp;
}//end for
if (nRet < m_nBytesPerLine){
CString sPad(_T(' '),2+3*(m_nBytesPerLine-nRet));
strLine += sPad;
}
strLine += _T(" ");
strLine += sChars;
return TRUE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?