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