OLEDBReportMFCView.cpp
上传用户:benben_wyd
上传日期:2010-02-26
资源大小:1229k
文件大小:7k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // OLEDBReportMFCView.cpp : implementation of the COLEDBReportMFCView class
  2. //
  3. #include "stdafx.h"
  4. #include "OLEDBReportMFC.h"
  5. #include "OLEDBReportMFCDoc.h"
  6. #include "OLEDBReportMFCView.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // COLEDBReportMFCView
  14. IMPLEMENT_DYNCREATE(COLEDBReportMFCView, CScrollView)
  15. BEGIN_MESSAGE_MAP(COLEDBReportMFCView, CScrollView)
  16. //{{AFX_MSG_MAP(COLEDBReportMFCView)
  17. //}}AFX_MSG_MAP
  18. // Standard printing commands
  19. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  20. ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
  21. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  22. END_MESSAGE_MAP()
  23. /////////////////////////////////////////////////////////////////////////////
  24. // COLEDBReportMFCView construction/destruction
  25. COLEDBReportMFCView::COLEDBReportMFCView()
  26. {
  27. }
  28. COLEDBReportMFCView::~COLEDBReportMFCView()
  29. {
  30. m_pSet->Close();
  31. }
  32. BOOL COLEDBReportMFCView::PreCreateWindow(CREATESTRUCT& cs)
  33. {
  34. return CScrollView::PreCreateWindow(cs);
  35. }
  36. /////////////////////////////////////////////////////////////////////////////
  37. // COLEDBReportMFCView drawing
  38. void COLEDBReportMFCView::OnDraw(CDC* pDC)
  39. {
  40. OutputReport(pDC); //Display contents
  41. }
  42. void COLEDBReportMFCView::OnInitialUpdate()
  43. {
  44. CScrollView::OnInitialUpdate();
  45. //Limit size to 8" x 20"
  46. CSize sizeTotal(800, 2000);
  47. //Because of MM_LOENGLISH, Sizes are in .01 of an inch
  48. SetScrollSizes(MM_LOENGLISH, sizeTotal);
  49. //Set the window title
  50. GetDocument()->SetTitle("OLE DB Students Per Class Report");
  51. //Set the m_pSet pointer to the m_dbSet recordset
  52. m_pSet = &GetDocument()->m_StudentsPerClass;
  53. //Open the recordset
  54. HRESULT hr = m_pSet->Open();
  55. if (hr != S_OK)
  56. {
  57. AfxMessageBox(_T("Row set failed to open."), MB_OK);
  58. }
  59. }
  60. /////////////////////////////////////////////////////////////////////////////
  61. // COLEDBReportMFCView printing
  62. BOOL COLEDBReportMFCView::OnPreparePrinting(CPrintInfo* pInfo)
  63. {
  64. // default preparation
  65. return DoPreparePrinting(pInfo);
  66. }
  67. void COLEDBReportMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  68. {
  69. }
  70. void COLEDBReportMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  71. {
  72. }
  73. /////////////////////////////////////////////////////////////////////////////
  74. // COLEDBReportMFCView diagnostics
  75. #ifdef _DEBUG
  76. void COLEDBReportMFCView::AssertValid() const
  77. {
  78. CScrollView::AssertValid();
  79. }
  80. void COLEDBReportMFCView::Dump(CDumpContext& dc) const
  81. {
  82. CScrollView::Dump(dc);
  83. }
  84. COLEDBReportMFCDoc* COLEDBReportMFCView::GetDocument() // non-debug version is inline
  85. {
  86. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COLEDBReportMFCDoc)));
  87. return (COLEDBReportMFCDoc*)m_pDocument;
  88. }
  89. #endif //_DEBUG
  90. /////////////////////////////////////////////////////////////////////////////
  91. // COLEDBReportMFCView message handlers
  92. void COLEDBReportMFCView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
  93. {
  94. OutputReport(pDC, pInfo); //Display contents
  95. }
  96. void COLEDBReportMFCView::OutputReport(CDC* pDC, CPrintInfo* pInfo)
  97. {
  98. CString line; //This is the print line
  99. TEXTMETRIC metrics; //Font measurements
  100. int y = 0; //Current y position on report
  101. CFont TitleFont; //Font for Title
  102. CFont HeadingFont; //Font for headings
  103. CFont DetailFont; //Font for detail lines
  104. CFont FooterFont; //Font for footer
  105. //Tab stops at 1 inch, 2.5 inches, and 6.5 inches
  106. int TabStops[] = {300, 650};
  107. //Tab stops at 3.5 inches and 6.5 inches
  108. int FooterTabStops[] = {350, 650};
  109. HRESULT m_hrMoveResult = S_OK;
  110. if (!pInfo || pInfo->m_nCurPage == 1) {
  111. //Set the recordset at the beginning
  112. m_hrMoveResult = m_pSet->MoveFirst();
  113. }
  114. //Bold font for Title
  115. TitleFont.CreateFont(44, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0,
  116. ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
  117. DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, 
  118. "Times New Roman");
  119. //Bold and underlined font for headings
  120. HeadingFont.CreateFont(36, 0, 0, 0, FW_BOLD, FALSE, TRUE, 0,
  121. ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
  122. DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, 
  123. "Times New Roman");
  124. //Normal font for detail
  125. DetailFont.CreateFont(18, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0,
  126. ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
  127. DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, 
  128. "Times New Roman");
  129. //Small font for footer
  130. FooterFont.CreateFont(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0,
  131. ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
  132. DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, 
  133. "Times New Roman");
  134. //Capture default settings when setting the title font
  135. CFont* OldFont = (CFont*) pDC->SelectObject(&TitleFont);
  136. //Retrieve the heading font measurements
  137. pDC->GetTextMetrics(&metrics);
  138. //Compute the heading line height
  139. int LineHeight = metrics.tmHeight + metrics.tmExternalLeading;
  140. //Set Y to the line height.
  141. y -= LineHeight;
  142. pDC->TextOut(100, 0, "OLE DB Students Per Class Report");
  143. /*
  144. Y must be set to negative numbers because MM_LOENGLISH was
  145. used in the CODBCReportView::OnInitialUpdate funciton.
  146. */
  147. //Set the Heading font
  148. pDC->SelectObject(&HeadingFont);
  149. //Format the heading
  150. line.Format("%s t%s t%s","Dept", "Class", "Students");
  151. //Output the heading at (2, y) using 2 tabs
  152. pDC->TabbedTextOut(2, y, line, 2, TabStops, 0);
  153. //Compute the detail line height
  154. LineHeight = metrics.tmHeight + metrics.tmExternalLeading;
  155. y -= LineHeight; //Adjust y position
  156. //Set the detail font
  157. pDC->SelectObject(&DetailFont);
  158. //Retrieve detail font measurements
  159. pDC->GetTextMetrics(&metrics);
  160. //Compute the detail line height
  161. LineHeight = metrics.tmHeight + metrics.tmExternalLeading;
  162. //Scroll through the recordset
  163. while (m_hrMoveResult == S_OK) {
  164. if (pInfo && abs(y) > 1000) {
  165. pInfo->SetMaxPage(pInfo->m_nCurPage + 1);
  166. break;
  167. }
  168. //Format the detail line
  169. line.Format("%s t%s t%d",
  170. m_pSet->m_DepartmentName,
  171. m_pSet->m_Description,
  172. m_pSet->m_NumberOfStudents);
  173. //Output the print line at (2, y) using 2 tabs
  174. pDC->TabbedTextOut(2, y, line, 2, TabStops, 0);
  175. //Get the next recordset number
  176. y -= LineHeight; //Adjust y position
  177. m_hrMoveResult = m_pSet->MoveNext();
  178. }
  179. if (pInfo) {
  180. //Set the footer font
  181. pDC->SelectObject(&FooterFont);
  182. //Format the footer
  183. line.Format(
  184. "OLE DB Report tPage %d tVisual C++ DB Guide",
  185. pInfo->m_nCurPage);
  186. //Output the footer at the bottom using tabs
  187. pDC->TabbedTextOut(1, -1025, line, 2, FooterTabStops, 0);
  188. }
  189. //Restore default settings
  190. pDC->SelectObject(OldFont);
  191. }