DumpXView.cpp
上传用户:ch83438830
上传日期:2007-01-01
资源大小:104k
文件大小:8k
源码类别:

文件操作

开发平台:

Visual C++

  1. // winpeView.cpp : implementation of the CDumpXView class
  2. //
  3. #include "stdafx.h"
  4. #include "winpe.h"
  5. #include "winpeDoc.h"
  6. #include "dumpxview.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. #define PRINTMARGIN 2
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CDumpXView
  15. IMPLEMENT_DYNCREATE(CDumpXView, CScrollView)
  16. BEGIN_MESSAGE_MAP(CDumpXView, CScrollView)
  17. //{{AFX_MSG_MAP(CDumpXView)
  18. ON_WM_CREATE()
  19. //}}AFX_MSG_MAP
  20. // Standard printing commands
  21. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  22. ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
  23. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  24. END_MESSAGE_MAP()
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CDumpXView construction/destruction
  27. CDumpXView::CDumpXView()
  28. {
  29. // TODO: add construction code here
  30. }
  31. CDumpXView::~CDumpXView()
  32. {
  33. }
  34. BOOL CDumpXView::PreCreateWindow(CREATESTRUCT& cs)
  35. {
  36. // TODO: Modify the Window class or styles here by modifying
  37. //  the CREATESTRUCT cs
  38. return CScrollView::PreCreateWindow(cs);
  39. }
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CDumpXView drawing
  42. void CDumpXView::OnDraw(CDC* pDC)
  43. {
  44. CWinpeDoc* pDoc = GetDocument();
  45. ASSERT_VALID(pDoc);
  46. //
  47. // my code.
  48. //
  49. if (m_nLinesTotal != 0)
  50. {
  51. CRect rect;
  52. pDC->GetClipBox(&rect);
  53. CFont * pOldFont = pDC->SelectObject(pDoc->m_screenFont);
  54. CSize size = pDC->GetTextExtent("Fg",2);
  55. INT nStart = rect.top / size.cy;
  56. INT nEnd = min (m_nLinesTotal -1,
  57.  (rect.bottom + size.cy - 1) /
  58.  size.cy);
  59. CString string;
  60. for (INT i = nStart; i <= nEnd; i++)
  61. {
  62. FormatLine(i,string);
  63. pDC->TextOut(2,((i*size.cy) +2),string);
  64. }
  65. pDC->SelectObject(pOldFont);
  66. }
  67. }
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CDumpXView printing
  70. BOOL CDumpXView::OnPreparePrinting(CPrintInfo* pInfo)
  71. {
  72. // default preparation
  73. return DoPreparePrinting(pInfo);
  74. }
  75. void CDumpXView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
  76. {
  77. CWinpeDoc* pDoc = GetDocument();
  78. ASSERT_VALID(pDoc);
  79. pDC->SetMapMode(MM_LOENGLISH);
  80.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  81.     
  82.     CSize size = pDC->GetTextExtent ("---------1---------2---------" 
  83.         "3---------4---------5---------6---------7---------8-", 81);
  84.     pDC->SelectObject (pOldFont);
  85. //
  86. // Get height and width then convert to logical
  87. //
  88. CSize vsz; // vertres horzres
  89. vsz.cy = pDC->GetDeviceCaps(VERTRES);
  90. vsz.cx = pDC->GetDeviceCaps(HORZRES);
  91. pDC->DPtoLP(&vsz);
  92. m_cyPrinter = size.cy;
  93. m_cxOffset = (vsz.cx - size.cx) / 2;
  94.     m_cxWidth = size.cx;
  95. //
  96.     //
  97. //
  98.     m_nLinesPerPage = (vsz.cy -
  99.         (m_cyPrinter * (3 + (2 * PRINTMARGIN)))) / m_cyPrinter;
  100.     UINT nMaxPage = max (1, (m_nLinesTotal + (m_nLinesPerPage - 1)) /
  101.         m_nLinesPerPage);
  102. if (m_nLinesTotal + (m_nLinesPerPage - 1) % m_nLinesPerPage)
  103. nMaxPage++;
  104.     pInfo->SetMaxPage (nMaxPage);
  105.     
  106. }
  107. void CDumpXView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  108. {
  109. // TODO: add cleanup after printing
  110. }
  111. /////////////////////////////////////////////////////////////////////////////
  112. // CDumpXView diagnostics
  113. #ifdef _DEBUG
  114. void CDumpXView::AssertValid() const
  115. {
  116. CScrollView::AssertValid();
  117. }
  118. void CDumpXView::Dump(CDumpContext& dc) const
  119. {
  120. CScrollView::Dump(dc);
  121. }
  122. CWinpeDoc* CDumpXView::GetDocument() // non-debug version is inline
  123. {
  124. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWinpeDoc)));
  125. return (CWinpeDoc*)m_pDocument;
  126. }
  127. #endif //_DEBUG
  128. /////////////////////////////////////////////////////////////////////////////
  129. // CDumpXView message handlers
  130. int CDumpXView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  131. {
  132. if (CScrollView::OnCreate(lpCreateStruct) == -1)
  133. return -1;
  134. // TODO: Add your specialized creation code here
  135. return 0;
  136. }
  137. void CDumpXView::OnInitialUpdate() 
  138. {
  139. CWinpeDoc* pDoc = GetDocument();
  140. ASSERT_VALID(pDoc);
  141. pDoc->TurnChecksOff();
  142. pDoc->m_Dump_Checked = TRUE;
  143. DWORD nDocLength = pDoc->GetDocumentLength();
  144. // + plus 15 to ensure even number division
  145. m_nLinesTotal = (nDocLength + 15) / 16;
  146. //
  147. CClientDC dc(this);
  148. TEXTMETRIC tm;
  149. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  150. dc.GetTextMetrics (&tm);
  151. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  152. dc.SelectObject(pOldFont);
  153. //
  154. SetScrollSizes (MM_TEXT,
  155. CSize(0,m_nLinesTotal * m_cyScreen),
  156. CSize(0,m_cyScreen * 100),
  157. CSize (0,m_cyScreen));
  158. ScrollToPosition(CPoint (0,0));
  159. CScrollView::OnInitialUpdate();
  160. // TODO: Add your specialized code here and/or call the base class
  161. }
  162. void CDumpXView::FormatLine(UINT nLine,CString& string)
  163. {
  164. BYTE b[17];
  165. ::FillMemory(b,16,32);
  166. UINT nCount = GetDocument()->GetBytes(nLine * 16,16,b);
  167. string.Format(
  168.  "%0.8X    %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X " 
  169.  "- %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X     ",
  170.  nLine * 16,
  171. b[0], b[1],b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], 
  172. b[10], b[11], b[12], b[13], b[14], b[15]);
  173. for (UINT i=0;i<nCount;i++)
  174. {
  175. if (!::IsCharAlphaNumeric(b[i]))
  176. b[i] = 0x2E;
  177. }
  178. b[nCount] = 0;
  179. string += b;
  180. if (nCount < 16)
  181. {
  182. UINT pos1 = 59;
  183. UINT pos2 = 60;
  184. UINT j = 16 - nCount;
  185. for (i=0;i<j;i++)
  186. {
  187. string.SetAt(pos1,' ');
  188. string.SetAt(pos2,' ');
  189. pos1 -= 3;
  190. pos2 -= 3;
  191. if (pos1 == 35)
  192. {
  193. string.SetAt(35,' ');
  194. string.SetAt(36,' ');
  195. pos1 = 33;
  196. pos2 = 34;
  197. }
  198. }
  199. }
  200. }
  201. void CDumpXView::PrintPageHeader(CDC* pDC, UINT nPageNumber)
  202. {
  203. CWinpeDoc* pDoc = GetDocument();
  204. ASSERT_VALID(pDoc);
  205. CString strHeader = GetDocument ()->GetPathName ();
  206.     if (strHeader.GetLength () > 68)
  207.         strHeader = GetDocument ()->GetTitle ();
  208.     CString strPageNumber;
  209.     strPageNumber.Format ("Page %d", nPageNumber);
  210.     UINT nSpaces = 81 - strPageNumber.GetLength () -
  211.         strHeader.GetLength ();
  212.     for (UINT i=0; i<nSpaces; i++)
  213.         strHeader += ' ';
  214.     strHeader += strPageNumber;
  215.     INT y = m_cyPrinter * PRINTMARGIN;
  216.     CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  217.     //pDC->TextOut (m_cxOffset, -y, strHeader);
  218. pDC->TextOut (0, -y, strHeader);
  219.     y += (m_cyPrinter * 3) / 2;
  220.     //pDC->MoveTo (m_cxOffset, -y);
  221. pDC->MoveTo (0, -y);
  222.     pDC->LineTo (m_cxWidth, -y);
  223. //pDC->LineTo (0, -y);
  224.     pDC->SelectObject (pOldFont);
  225. }
  226. void CDumpXView::PrintPage(CDC* pDC, UINT nPageNumber)
  227. {
  228. CWinpeDoc* pDoc = GetDocument();
  229. ASSERT_VALID(pDoc);
  230. if (m_nLinesTotal != 0) {
  231.         INT nStart = (nPageNumber - 1) * m_nLinesPerPage;
  232.         INT nEnd = min (m_nLinesTotal - 1, nStart + m_nLinesPerPage - 1);
  233.         CString string;
  234.         CFont* pOldFont = pDC->SelectObject (pDoc->m_printerFont);
  235.         INT y;
  236.         for (INT i=nStart; i<=nEnd; i++) {
  237.             FormatLine (i, string);
  238.             y = ((i - nStart) + PRINTMARGIN + 3) * m_cyPrinter;
  239.             //pDC->TextOut (m_cxOffset, -y, string);
  240. pDC->TextOut (0, -y, string);
  241.         }
  242.         pDC->SelectObject (pOldFont);
  243.     }
  244. }
  245. void CDumpXView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
  246. {
  247. PrintPageHeader (pDC, pInfo->m_nCurPage);
  248.     PrintPage (pDC, pInfo->m_nCurPage);
  249. }
  250. void CDumpXView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
  251. {
  252. // TODO: Add your specialized code here and/or call the base class
  253. CWinpeDoc* pDoc = GetDocument();
  254. ASSERT_VALID(pDoc);
  255. CScrollView::OnPrepareDC(pDC, pInfo);
  256. if (pInfo)
  257. {
  258. pDC->SetMapMode(MM_LOENGLISH);
  259. pDC->SelectObject(pDoc->m_printerFont);
  260. }
  261. }
  262. void CDumpXView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
  263. {
  264. // TODO: Add your specialized code here and/or call the base class
  265. CWinpeDoc* pDoc = GetDocument();
  266. ASSERT_VALID(pDoc);
  267. CClientDC dc(this);
  268. TEXTMETRIC tm;
  269. CFont* pOldFont = dc.SelectObject(pDoc->m_screenFont);
  270. dc.GetTextMetrics (&tm);
  271. m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
  272. dc.SelectObject(pOldFont);
  273. //
  274. SetScrollSizes (MM_TEXT,
  275. CSize(0,m_nLinesTotal * m_cyScreen),
  276. CSize(0,m_cyScreen * 100),
  277. CSize (0,m_cyScreen));
  278. ScrollToPosition(CPoint (0,0));
  279. CRect rect;
  280. dc.GetClipBox(&rect);
  281. InvalidateRect(&rect);
  282. }