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