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

书籍源码

开发平台:

Visual C++

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