114 lines
2.9 KiB
C++
114 lines
2.9 KiB
C++
// DlgResEdit.cpp : implementation file
|
|
//
|
|
//----------------- Dundas Software ----------------------------------------
|
|
//========================================================================
|
|
|
|
#include "stdafx.h"
|
|
#include "ResFile.h"
|
|
#include "DlgResEdit.h"
|
|
|
|
#include "OXResourceFile.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDlgResEdit dialog
|
|
|
|
|
|
CDlgResEdit::CDlgResEdit(COXResourceFile* pResFile, CWnd* pParent /*=NULL*/)
|
|
: CDialog(CDlgResEdit::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CDlgResEdit)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
m_pResFile = pResFile;
|
|
}
|
|
|
|
void CDlgResEdit::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CDlgResEdit)
|
|
DDX_Control(pDX, IDC_DUMP, m_ctlDump);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CDlgResEdit, CDialog)
|
|
//{{AFX_MSG_MAP(CDlgResEdit)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDlgResEdit message handlers
|
|
|
|
BOOL CDlgResEdit::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// ... set 10 point Courier font
|
|
if (m_fontCourier.CreatePointFont(100, _T("Courier")))
|
|
m_ctlDump.SetFont(&m_fontCourier, FALSE);
|
|
|
|
DumpResContents();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CDlgResEdit::DumpResContents()
|
|
{
|
|
const BYTE LOWER_PRINTABLE = 32;
|
|
const BYTE UPPER_PRINTABLE = 126;
|
|
const UINT LINE_SIZE = 16;
|
|
const UINT TEXT_POS0 = 6 + 2 + LINE_SIZE * (2 + 1) + 2;
|
|
const UINT CH_PER_LINE = TEXT_POS0 + LINE_SIZE + 2;
|
|
|
|
BYTE lpBuffer[LINE_SIZE];
|
|
CString sTemp;
|
|
BYTE nTemp;
|
|
int p, ptext, i, nBytesRead;
|
|
|
|
DWORD_PTR nFileLen = (DWORD_PTR)m_pResFile->GetLength();
|
|
ASSERT(nFileLen);
|
|
UINT nMax = ((UINT)((nFileLen - 1) / LINE_SIZE + 1)) * CH_PER_LINE;
|
|
CString sOutput(_T(' '), nMax);
|
|
|
|
m_pResFile->SeekToBegin();
|
|
for (UINT nLinePos0 = 0; nLinePos0 < nMax; nLinePos0 += CH_PER_LINE)
|
|
{
|
|
p = nLinePos0;
|
|
ptext = p + TEXT_POS0;
|
|
|
|
sTemp.Format(_T("%06x"), m_pResFile->GetPosition());
|
|
for (i = 0; i < 6; i++) sOutput.SetAt(p++, sTemp[i]);
|
|
|
|
p += 2; // leave two space
|
|
nBytesRead = m_pResFile->Read(lpBuffer, LINE_SIZE);
|
|
for (i = 0; i < nBytesRead; i++)
|
|
{
|
|
nTemp = lpBuffer[i];
|
|
sTemp.Format(_T("%02X"), nTemp);
|
|
sOutput.SetAt(p++, sTemp[0]);
|
|
sOutput.SetAt(p++, sTemp[1]);
|
|
p++; // leave one space
|
|
if (i == LINE_SIZE / 2 - 1) p++; // leave one more space after half block
|
|
|
|
if (nTemp >= LOWER_PRINTABLE && nTemp <= UPPER_PRINTABLE)
|
|
{
|
|
sTemp.Format(_T("%c"), nTemp);
|
|
sOutput.SetAt(ptext++, sTemp[0]);
|
|
}
|
|
else
|
|
sOutput.SetAt(ptext++, _T('.'));
|
|
}
|
|
|
|
sOutput.SetAt(nLinePos0 + CH_PER_LINE - 2, _T('\r'));
|
|
sOutput.SetAt(nLinePos0 + CH_PER_LINE - 1, _T('\n'));
|
|
}
|
|
|
|
m_ctlDump.SetWindowText(sOutput);
|
|
} |