154 lines
3.3 KiB
C++
154 lines
3.3 KiB
C++
// HexView.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "Communicator.h"
|
|
#include "CommunicatorDoc.h"
|
|
#include "HexView.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CHexView
|
|
|
|
IMPLEMENT_DYNCREATE(CHexView, CEditView)
|
|
|
|
CHexView::CHexView()
|
|
{
|
|
}
|
|
|
|
CHexView::~CHexView()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CHexView, CEditView)
|
|
//{{AFX_MSG_MAP(CHexView)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CHexView diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CHexView::AssertValid() const
|
|
{
|
|
CEditView::AssertValid();
|
|
}
|
|
|
|
void CHexView::Dump(CDumpContext& dc) const
|
|
{
|
|
CEditView::Dump(dc);
|
|
}
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CHexView message handlers
|
|
|
|
void CHexView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
|
|
{
|
|
UNREFERENCED_PARAMETER(pSender);
|
|
CCommunicatorDoc::CHintData* pHintData = (CCommunicatorDoc::CHintData*)pHint;
|
|
CString sText;
|
|
|
|
if (lHint == CCommunicatorDoc::NotifyAddData)
|
|
{
|
|
sText.Format(_T("%i. Data length = 0x%X (%i)\r\n"),
|
|
pHintData->m_hClient, pHintData->m_nDataLength, pHintData->m_nDataLength);
|
|
AddText(sText);
|
|
|
|
// Show the received data
|
|
if (pHintData->m_pData == NULL)
|
|
{
|
|
sText = _T("\t<Unknown Data>\r\n");
|
|
AddText(sText);
|
|
return;
|
|
}
|
|
|
|
BYTE* pData = pHintData->m_pData;
|
|
UINT nMaxIndex = pHintData->m_nDataLength;
|
|
UINT nIndex = 0;
|
|
CString sRaw;
|
|
CString sHex;
|
|
CString sHexTemp;
|
|
while (nIndex < nMaxIndex)
|
|
{
|
|
// Split in two parts (of 8 bytes) seperated by a space
|
|
sRaw.Empty();
|
|
sHex.Empty();
|
|
|
|
// ... Add offset
|
|
sRaw.Format(_T("%4.4X "), nIndex);
|
|
|
|
for (int nLoop = 0; nLoop < 2; nLoop++)
|
|
{
|
|
// Calculate 8 bytes
|
|
UINT nPartIndex = 0;
|
|
while (nPartIndex < 8 && nIndex < nMaxIndex)
|
|
{
|
|
if (isprint(pData[nIndex]))
|
|
sRaw += (char)pData[nIndex];
|
|
else
|
|
sRaw += _T('.');
|
|
sHexTemp.Format(_T("%2.2X "), pData[nIndex]);
|
|
sHex += sHexTemp;
|
|
nPartIndex++;
|
|
nIndex++;
|
|
}
|
|
|
|
sRaw += _T(' ');
|
|
sHex += _T(' ');
|
|
}
|
|
|
|
// Show the text
|
|
sText.Format(_T("%-24.24s|%s\r\n"), sRaw, sHex);
|
|
AddText(sText);
|
|
}
|
|
AddText(_T("\r\n"));
|
|
}
|
|
}
|
|
|
|
void CHexView::AddText(LPCTSTR pszText)
|
|
{
|
|
LONG nWindowTextLength;
|
|
nWindowTextLength = GetEditCtrl().GetWindowTextLength();
|
|
GetEditCtrl().SetSel(nWindowTextLength, nWindowTextLength);
|
|
GetEditCtrl().ReplaceSel(pszText);
|
|
}
|
|
|
|
|
|
BOOL CHexView::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
BOOL bRet = CEditView::PreCreateWindow(cs);
|
|
cs.style |= ES_READONLY;
|
|
return bRet;
|
|
}
|
|
|
|
void CHexView::OnInitialUpdate()
|
|
{
|
|
CEditView::OnInitialUpdate();
|
|
|
|
// Create a fixed size font
|
|
m_font.CreateFont( 0, // nHeight
|
|
0, // nWidth
|
|
0, // nEscapement
|
|
0, // nOrientation
|
|
FW_DONTCARE, // nWeight
|
|
FALSE, // bItalic
|
|
FALSE, // bUnderline
|
|
0, // cStrikeOut
|
|
DEFAULT_CHARSET, // nCharSet
|
|
OUT_DEFAULT_PRECIS, // nOutPrecision
|
|
CLIP_DEFAULT_PRECIS, // nClipPrecision
|
|
DEFAULT_QUALITY, // nQuality
|
|
FIXED_PITCH, // nPitchAndFamily
|
|
NULL); // lpszFacename
|
|
|
|
GetEditCtrl().SetFont(&m_font, FALSE);
|
|
}
|