2025-11-27 16:46:48 +09:00

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);
}