Heksadecymalna przeglądarka plików – funkcje związane z

Transkrypt

Heksadecymalna przeglądarka plików – funkcje związane z
Heksadecymalna przeglądarka plików – funkcje związane z drukowaniem
1
CHexView::CHexView()
{
m_nPointSize = 140;
m_nPrnPointSize = 120;
}
// wyprowadź dane
for (DWORD i = i1; i <= i2; i++)
{
CString sHex1, sHex2, sAsc1, sAsc2;
for (int j = 0; j < 8; j++)
{
if (16 * i + j < nLen)
{
sHex1 += Hex(pDoc->GetByte(16 * i + j)) + " ";
sAsc1 += (char)(pDoc->GetByte(16 * i + j));
}
if (16 * i + j + 8 < nLen)
{
sHex2 += Hex(pDoc->GetByte(16 * i + j + 8)) + " ";
sAsc2 += (char)(pDoc->GetByte(16 * i + j + 8));
}
}
CString str;
str.Format("%08X
%-24s %-24s
%-8s%-8s",
16 * i, sHex1, sHex2, sAsc1, sAsc2);
pDC->TextOut(5, y, str);
y += nTextHeight;
}
// funkcja pomocnicza
CString Hex(BYTE b)
{
char *D = "0123456789ABCDEF";
return CString(D[b/16]) + D[b%16];
}
void CHexView::OnDraw(CDC* pDC)
{
CHexDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// liczba bajtów
DWORD nLen = pDoc->GetLength();
// część zależna od drukowania
CFont *pFont;
// czcionka
int nTextHeight;
// wysokość linijki tekstu
DWORD i1, i2;
// zakres rysowanych linijek
int y;
// współrzędna pionowa rysowanych linijek
if (pDC->IsPrinting())
{
// drukowanie
pFont = m_pPrnFont;
nTextHeight = m_nPrnTextHeight;
i1 = m_nCurrentLine;
i2 = i1 + m_nLinesPerPage - 1;
if (i2 > nLen / 16) i2 = nLen / 16;
y = m_nPrnTextHeight * 2;
}
else
{
// wyświetlanie
pFont = &m_font;
nTextHeight = m_nTextHeight;
CRect clipBox;
::GetClipBox(pDC->m_hDC, clipBox);
i1 = clipBox.top / nTextHeight; if (i1) i1--;
i2 = clipBox.bottom / nTextHeight;
if (i2 > nLen / 16) i2 = nLen / 16;
y = i1 * nTextHeight;
}
CFont *pOldFont = pDC->SelectObject(pFont);
pDC->SelectObject(pOldFont);
}
void CHexView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CClientDC dc(this);
// utwórz czcionkę 12-punktową
int nFontSize = ::MulDiv(m_nPointSize,
dc.GetDeviceCaps(LOGPIXELSY), 720);
m_font.CreateFont(nFontSize,0,0,0,FW_NORMAL,0,0,0,0,0,0,0,FIXED_PITCH, "");
// oblicz wysokość linijki
CFont *pOldFont = dc.SelectObject(&m_font);
m_nTextHeight = dc.GetTextExtent("Coś").cy;
dc.SelectObject(pOldFont);
// określ rozmiary widoku
CSize sizeTotal;
sizeTotal.cx = 100;
sizeTotal.cy = m_nTextHeight * GetDocument()->GetLength() / 16
+ m_nTextHeight;
SetScrollSizes(MM_TEXT, sizeTotal);
}
Heksadecymalna przeglądarka plików – funkcje związane z drukowaniem
/////////////////////////////////////////////////////////////////////////
// CHexView printing
BOOL CHexView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CHexView::OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo)
{
// utwórz 10-punktową czcionkę dla drukarki
m_pPrnFont = new CFont;
int nFontSize = ::MulDiv(m_nPrnPointSize,
pDC->GetDeviceCaps(LOGPIXELSY), 720);
m_pPrnFont->CreateFont(nFontSize,0,0,0,FW_NORMAL,0,0,0,0,0,0,0,
FIXED_PITCH, "");
// oblicz wysokość linijki
CFont *pOldFont = pDC->SelectObject(m_pPrnFont);
m_nPrnTextHeight = pDC->GetTextExtent("Coś").cy;
pDC->SelectObject(pOldFont);
// oblicz liczbę linijek na stronie i stron w dokumencie
m_nLinesPerPage = pDC->GetDeviceCaps(VERTRES) / m_nPrnTextHeight;
m_nLinesPerPage -= 2; // miejsce na nagłówek!
m_nPagesPerDoc = GetDocument()->GetLength() / 16 / m_nLinesPerPage + 1;
pInfo->SetMaxPage(m_nPagesPerDoc);
}
void CHexView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
CScrollView::OnPrepareDC(pDC, pInfo);
if (pInfo)
m_nCurrentLine = (pInfo->m_nCurPage - 1) * m_nLinesPerPage;
else
m_nCurrentLine = 0;
}
void CHexView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
delete m_pPrnFont;
m_pPrnFont = NULL;
}
2
void CHexView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
PrintHeader(pDC, pInfo);
CScrollView::OnPrint(pDC, pInfo);
}
void CHexView::PrintHeader(CDC* pDC, CPrintInfo* pInfo)
{
// oblicz szerokość strony
int nWidth = pDC->GetDeviceCaps(HORZRES);
// po lewej: tytuł dokumantu
pDC->TextOut(2, 0, GetDocument()->GetTitle());
// po prawej: numer strony
CString str;
str.Format("%d", pInfo->m_nCurPage);
int cx = pDC->GetTextExtent(str).cx;
pDC->TextOut(nWidth - cx - 2, 0, str);
// na dole: linia oddzielająca
pDC->MoveTo(2, m_nPrnTextHeight);
pDC->LineTo(nWidth - 2, m_nPrnTextHeight);
}
// Zmienne składowe CHexView
// wyświetlanie ekranowe
int m_nPointSize;
// miara punktowa czcionki
CFont m_font;
// font
int m_nTextHeight;
// wysokość linijki
// drukowanie
int m_nPrnPointSize; // miara punktowa czcionki do drukowania
CFont *m_pPrnFont;
// font do drukowania
int m_nPrnTextHeight; // wysokość linijki podczas drukowania
// paginacja
int m_nLinesPerPage;
int m_nPagesPerDoc;
int m_nCurrentLine;
// liczba linijek na stronie
// liczba stron
// pierwsza linijka na aktualnej stronie
// Fragment deklaracji CHexDoc
protected:
BYTE *m_pBytes;// dane
DWORD m_nLen; // długość bufora danych
public:
DWORD GetLength()
{ return m_nLen; }
BYTE GetByte(DWORD i) { return m_pBytes[i]; }

Podobne dokumenty