REPORTVIEW.CPP
上传用户:shgx688
上传日期:2009-12-27
资源大小:855k
文件大小:13k
源码类别:

SNMP编程

开发平台:

MultiPlatform

  1. // ReportView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "OAM.h"
  5. #include "OamDoc.h"
  6. #include "ReportView.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CReportView
  14. IMPLEMENT_DYNCREATE(CReportView, CScrollView)
  15. CReportView::CReportView()
  16. {
  17. m_nHasAlert = 0;
  18. m_nSplashCnt = 0;
  19. m_nChildID = 0;
  20. m_pFont = NULL;
  21. m_nMapMode = MM_TEXT;
  22. m_nType = 0;
  23. m_crText = RGB(0,0,0);
  24. m_crStrictText = RGB(255,0,0);
  25. memset(&m_lfFont, 0, sizeof(m_lfFont));
  26. m_lfFont.lfHeight = -9;
  27. m_lfFont.lfWeight = FW_DONTCARE;
  28. m_lfFont.lfPitchAndFamily = FIXED_PITCH | FW_DONTCARE;
  29. strcpy(m_lfFont.lfFaceName, "FixedSys");
  30. // Set a reasonable default font size for scrollbar initialization
  31. m_charSize.cx = 8;
  32. m_charSize.cy = 15;
  33. }
  34. CReportView::~CReportView()
  35. {
  36. if (m_pFont)
  37. {
  38. delete m_pFont;
  39. m_pFont = NULL;
  40. }
  41. }
  42. BEGIN_MESSAGE_MAP(CReportView, CScrollView)
  43. //{{AFX_MSG_MAP(CReportView)
  44. ON_WM_SIZE()
  45. ON_WM_LBUTTONDBLCLK()
  46. ON_WM_KEYDOWN()
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CReportView drawing
  51. void CReportView::OnInitialUpdate()
  52. {
  53. CScrollView::OnInitialUpdate();
  54. CSize sizeTotal;
  55. // TODO: calculate the total size of this view
  56. sizeTotal.cx = sizeTotal.cy = 100;
  57. SetScrollSizes(MM_TEXT, sizeTotal);
  58. COAMDoc * pDoc = GetDocument();
  59. if (m_pFont)
  60. {
  61. delete m_pFont;
  62. m_pFont = NULL;
  63. }
  64. m_pFont = new CFont;
  65. m_pFont->CreateFontIndirect(&m_lfFont);
  66. }
  67. void CReportView::OnDraw(CDC* pDC)
  68. {
  69. // TODO: add draw code here
  70. RECT rect;
  71. CPoint scrollPos;
  72. int nRow, nCol, nEndRow, nEndCol, nCount, nHorzPos, nVertPos;
  73. CFont *pOldFont;
  74. COAMDoc *pDoc = GetDocument();
  75. ASSERT_VALID(pDoc);
  76. // Calculate text block that needs to be displayed
  77. rect = ((CPaintDC *)pDC)->m_ps.rcPaint; // Rectangle to be painted
  78. pOldFont = pDC->SelectObject(m_pFont);
  79. // set the text color as appropriate
  80. COLORREF cr = m_crText;
  81. if (cr == GetSysColor(COLOR_WINDOW))
  82. cr = GetSysColor(COLOR_WINDOW+1);
  83. // pDC->SetTextColor(cr);
  84. // COLORREF crStrict = m_crStrictText;
  85. // if (crStrict == GetSysColor(COLOR_WINDOW))
  86. // crStrict = GetSysColor(COLOR_WINDOW+1);
  87. pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
  88. scrollPos = GetScrollPosition();
  89. rect.left += scrollPos.x;
  90. rect.top += scrollPos.y;
  91. rect.right += scrollPos.x;
  92. rect.bottom += scrollPos.y;
  93. nRow = min(MAXROW - 1, max(0, rect.top / m_charSize.cy));
  94. nEndRow = min(MAXROW - 1, (rect.bottom - 1) / m_charSize.cy);
  95. // nCol = min(MAXCOL - 1, max(0, rect.left / m_charSize.cx));
  96. // nEndCol = min(MAXCOL - 1, (rect.right - 1) / m_charSize.cx);
  97. nCol = 0;
  98. nEndCol = MAXCOL-1;
  99. // BYTE byteTest = m_pScreen[((nRow + m_OperationReportData.m_nTopRow) % MAXROW) * MAXCOL + nCol];
  100. // if( (byteTest | 0x80) && !IsDBCSLeadByte(byteTest)) nCol = max(0,nCol-1);
  101. // Repaint calculated portion of view
  102. nCount = nEndCol - nCol + 1;
  103. for (; nRow <= nEndRow; nRow++)
  104. {
  105. nVertPos = nRow * m_charSize.cy;
  106. // nHorzPos = nCol * m_charSize.cx;
  107. nHorzPos = 0;
  108. rect.top = nVertPos;
  109. rect.bottom = nVertPos + m_charSize.cy;
  110. rect.left = nHorzPos;
  111. rect.right = nHorzPos + m_charSize.cx * nCount;
  112. pDC->SetBkMode(OPAQUE);
  113. /* pDC->ExtTextOut(nHorzPos, nVertPos, ETO_OPAQUE | ETO_CLIPPED, &rect,
  114. (LPSTR)(&(m_pScreen[(nRow + m_OperationReportData.m_nTopRow) %
  115. MAXROW][nCol])), nCount, NULL);
  116. */
  117. if(m_OperationReportData.m_pReportString[((nRow + m_OperationReportData.m_nTopRow) % MAXROW)].m_Type == OPERATE_REPORT)
  118. pDC->SetTextColor(cr);
  119. else
  120. pDC->SetTextColor(m_OperationReportData.m_pReportString[((nRow + m_OperationReportData.m_nTopRow) % MAXROW)].m_Type);
  121. pDC->ExtTextOut(nHorzPos, nVertPos, ETO_OPAQUE | ETO_CLIPPED, &rect,
  122. (LPCSTR)(&(m_OperationReportData.m_pReportString[((nRow + m_OperationReportData.m_nTopRow) %
  123. MAXROW)].m_pString[nCol])), nCount, NULL);
  124. }
  125. // Reset cursor location
  126. MoveCursor();
  127. pDC->SelectObject(pOldFont);
  128. }
  129. /////////////////////////////////////////////////////////////////////////////
  130. // CReportView diagnostics
  131. #ifdef _DEBUG
  132. void CReportView::AssertValid() const
  133. {
  134. CScrollView::AssertValid();
  135. }
  136. void CReportView::Dump(CDumpContext& dc) const
  137. {
  138. CScrollView::Dump(dc);
  139. }
  140. COAMDoc* CReportView::GetDocument()
  141. {
  142. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COAMDoc)));
  143. return (COAMDoc*)m_pDocument;
  144. }
  145. #endif //_DEBUG
  146. /////////////////////////////////////////////////////////////////////////////
  147. // CReportView message handlers
  148. void CReportView::MoveCursor(BOOL bScroll)
  149. {
  150. POINT scrollPos;
  151. POINT newPos;
  152. POINT toPos;
  153. BOOL needScroll;
  154. RECT clientRect;
  155. COAMDoc *pDoc = GetDocument();
  156. ASSERT_VALID(pDoc);
  157. // Calculate cursor position on view
  158. scrollPos = GetScrollPosition();
  159. newPos.x = (m_OperationReportData.m_nColumn) * m_charSize.cx - scrollPos.x;
  160. newPos.y = ((m_OperationReportData.m_nRow + MAXROW - m_OperationReportData.m_nTopRow) % MAXROW) *
  161. m_charSize.cy - scrollPos.y;
  162. // if (m_bHasCaret) SetCaretPos(newPos);
  163. // If bScroll is TRUE, scroll view to show cursor
  164. if (bScroll)
  165. {
  166. toPos.x = scrollPos.x;
  167. toPos.y = scrollPos.y;
  168. needScroll = FALSE;
  169. GetClientRect(&clientRect);
  170. if (newPos.x < 0)
  171. {
  172. toPos.x += newPos.x;
  173. needScroll = TRUE;
  174. }
  175. if (newPos.y < 0)
  176. {
  177. toPos.y += newPos.y;
  178. needScroll = TRUE;
  179. }
  180. if (newPos.x + m_charSize.cx > clientRect.right)
  181. {
  182. toPos.x += newPos.x + m_charSize.cx - clientRect.right;
  183. needScroll = TRUE;
  184. }
  185. if (newPos.y + m_charSize.cy > clientRect.bottom)
  186. {
  187. toPos.y += newPos.y + m_charSize.cy - clientRect.bottom;
  188. needScroll = TRUE;
  189. }
  190. if (m_OperationReportData.m_nScrolled > 0)
  191. {
  192. toPos.y += (m_OperationReportData.m_nScrolled) * m_charSize.cy;
  193. if (m_nMapMode != MM_TEXT)
  194. {
  195. CWindowDC dc(NULL);
  196. dc.SetMapMode(m_nMapMode);
  197. dc.LPtoDP((LPPOINT)&toPos);
  198. }
  199. ScrollToDevicePosition(toPos);
  200. m_OperationReportData.m_nScrolled = 0;
  201. }
  202. else if (needScroll) ScrollToPosition(toPos);
  203. }
  204. }
  205. void CReportView::SetSizes()
  206. {
  207. SIZE sizeTotal;
  208. SIZE sizePage;
  209. SIZE sizeLine;
  210. RECT clientRect;
  211. COAMDoc *pDoc = GetDocument();
  212. ASSERT_VALID(pDoc);
  213. // Calculate scrollbar sizes
  214. GetClientRect(&clientRect);
  215. sizeTotal.cx = m_charSize.cx * MAXCOL;
  216. sizeTotal.cy = m_charSize.cy *
  217. ((m_OperationReportData.m_nRow + MAXROW - (m_OperationReportData.m_nTopRow)) % MAXROW + 1);
  218. sizePage.cx = clientRect.right - clientRect.right % m_charSize.cx;
  219. sizePage.cy = clientRect.bottom - clientRect.bottom % m_charSize.cy;
  220. sizeLine.cx = m_charSize.cx;
  221. sizeLine.cy = m_charSize.cy;
  222. SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine);
  223. }
  224. void CReportView::SetFont(LOGFONT * lf)
  225. {
  226. if (m_pFont)
  227. {
  228. delete m_pFont;
  229. m_pFont = NULL;
  230. }
  231. m_pFont = new CFont;
  232. m_pFont->CreateFontIndirect(lf);
  233. SetSizes();
  234. Invalidate();
  235. MoveCursor(TRUE);
  236. }
  237. void CReportView::OnSize(UINT nType, int cx, int cy) 
  238. {
  239. CScrollView::OnSize(nType, cx, cy);
  240. // TODO: Add your message handler code here
  241. if (nType != SIZE_MINIMIZED && cx != 0 && cy != 0 )
  242. {
  243. // SetSizes(); // Reset scrollbars
  244. }
  245. }
  246. void CReportView::SetType(int type)
  247. {
  248. m_nType = type;
  249. }
  250. void CReportView::OnLButtonDblClk(UINT nFlags, CPoint point) 
  251. {
  252. // TODO: Add your message handler code here and/or call default
  253. CScrollView::OnLButtonDblClk(nFlags, point);
  254. }
  255. void CReportView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  256. {
  257. // TODO: Add your message handler code here and/or call default
  258. UINT msg;
  259. UINT wCode;
  260. BOOL IsKey = TRUE;
  261. switch(nChar){
  262. case VK_DOWN:
  263.   msg=WM_VSCROLL;
  264.   wCode=SB_LINEDOWN;
  265.   break;
  266. case VK_UP:
  267.   msg=WM_VSCROLL;
  268.   wCode=SB_LINEUP;
  269.   break;
  270. case VK_LEFT:
  271.   msg=WM_HSCROLL;
  272.   wCode=SB_LINEUP;
  273.   break;
  274. case VK_RIGHT:
  275.   msg=WM_HSCROLL;
  276.   wCode=SB_LINEDOWN;
  277.   break;
  278. case  VK_NEXT:
  279.   msg=WM_VSCROLL;
  280.   wCode=SB_PAGEDOWN;
  281.   break;
  282. case VK_PRIOR:
  283.   msg=WM_VSCROLL;
  284.   wCode=SB_PAGEUP;
  285.  break;
  286. case VK_HOME:
  287.   if(GetKeyState(0x11)<0){
  288.   msg=WM_VSCROLL;
  289.   wCode=SB_TOP;
  290.   }
  291.   else{
  292.   msg=WM_HSCROLL;
  293.   wCode=SB_LEFT;
  294.   }
  295.  break;
  296. case VK_END:
  297.   if(GetKeyState(0x11)<0){
  298.   msg=WM_VSCROLL;
  299.   wCode=SB_RIGHT;
  300.   }
  301.   else{
  302.   msg=WM_HSCROLL;
  303.   wCode=SB_BOTTOM;
  304.   }
  305. break;
  306. default:
  307. IsKey = FALSE;
  308. break;
  309. }
  310. if(IsKey)
  311. for(UINT i=0; i<nRepCnt; i++)
  312. PostMessage(msg,wCode,0l);
  313. CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
  314. }
  315. BOOL CReportView::WriteReportBlock(LPSTR lpBlock, int nLength, int Type)
  316. {
  317. int i;
  318. RECT rect;
  319. // if(Type == STRICT_OPERATE_REPORT)
  320. m_OperationReportData.m_pReportString[(m_OperationReportData.m_nRow)].m_Type = Type;
  321. for (i = 0; i < nLength; i++)
  322. {
  323. switch (lpBlock[i])
  324. {
  325. // Process special characters
  326. case ASCII_BEL:
  327. MessageBeep(0);
  328. break;
  329. case ASCII_BS:
  330. if (m_OperationReportData.m_nColumn > 0)
  331. {
  332. (m_OperationReportData.m_nColumn)--;
  333. }
  334. break;
  335. case ASCII_TAB:
  336. if (((m_OperationReportData.m_nColumn) / TABSTOP) < ((MAXCOL - 1) / TABSTOP))
  337. {
  338. m_OperationReportData.m_nColumn += TABSTOP - m_OperationReportData.m_nColumn % TABSTOP;
  339. MoveCursor(TRUE);
  340. }
  341. break;
  342. case ASCII_CR:
  343. m_OperationReportData.m_nColumn = 0;
  344. case ASCII_LF:
  345. if (++(m_OperationReportData.m_nRow) >= MAXROW) (m_OperationReportData.m_nRow) = 0;
  346. if ((m_OperationReportData.m_nRow) == (m_OperationReportData.m_nTopRow))
  347. {
  348. m_OperationReportData.m_bScrolled = TRUE;
  349. memset(&m_OperationReportData.m_pReportString[(m_OperationReportData.m_nTopRow)], ' ', sizeof(ReprtString));
  350. (m_OperationReportData.m_nTopRow)++;
  351. (m_OperationReportData.m_nScrolled)++;
  352. if (m_OperationReportData.m_nTopRow >= MAXROW) m_OperationReportData.m_nTopRow = 0;
  353. }
  354. SetSizes();
  355. break;
  356. default:
  357. m_OperationReportData.m_pReportString[(m_OperationReportData.m_nRow)].m_pString[m_OperationReportData.m_nColumn] = lpBlock[i];
  358. rect.left = (m_OperationReportData.m_nColumn) * m_charSize.cx -
  359. GetScrollPosition().x;
  360. rect.top = ((m_OperationReportData.m_nRow + MAXROW - m_OperationReportData.m_nTopRow) % MAXROW) *
  361. m_charSize.cy - GetScrollPosition().y;
  362. rect.right = rect.left + m_charSize.cx;
  363. rect.bottom = rect.top + m_charSize.cy;
  364. InvalidateRect(&rect, FALSE);
  365. if (++(m_OperationReportData.m_nColumn) >= MAXCOL)
  366. {
  367. // if (m_bAutoWrap)
  368. {
  369. // if (m_bNewLine)
  370. // WriteReportBlock("r", 1, Type);
  371. // else 
  372. WriteReportBlock("r", 1, Type);
  373. }
  374. // else m_nColumn--;
  375. }
  376. break;
  377. }
  378. }
  379. MoveCursor(TRUE);
  380. return TRUE;
  381. }
  382. BOOL CReportView::WriteReportLine(LPSTR lpBlock, int Type,BOOL bShowTime)
  383. {
  384. CString strHead;
  385. if(bShowTime)
  386. {
  387. CTime  NowTime;
  388. NowTime=CTime::GetCurrentTime();
  389. strHead = NowTime.Format("%Y/%m/%d %H:%M:%S ");
  390. }
  391. int nLength = min(MAXCOL,strlen(lpBlock)+strHead.GetLength());
  392. RECT rect;
  393. memcpy(m_OperationReportData.m_pReportString[(m_OperationReportData.m_nRow)].m_pString,strHead.GetBuffer(strHead.GetLength()),strHead.GetLength());
  394. memcpy(&m_OperationReportData.m_pReportString[(m_OperationReportData.m_nRow)].m_pString[strHead.GetLength()],lpBlock,nLength-strHead.GetLength());
  395. m_OperationReportData.m_pReportString[(m_OperationReportData.m_nRow)].m_Type = Type;//(BYTE)STRICT_OPERATE_REPORT;
  396. rect.left = (m_OperationReportData.m_nColumn) * m_charSize.cx -
  397. GetScrollPosition().x;
  398. (m_OperationReportData.m_nColumn) += nLength;
  399. rect.top = ((m_OperationReportData.m_nRow + MAXROW - m_OperationReportData.m_nTopRow) % MAXROW) *
  400. m_charSize.cy - GetScrollPosition().y;
  401. rect.right = rect.left + nLength * m_charSize.cx;
  402. rect.bottom = rect.top + m_charSize.cy;
  403. InvalidateRect(&rect, FALSE);
  404. m_OperationReportData.m_nColumn = 0;
  405. if (++(m_OperationReportData.m_nRow) >= MAXROW) (m_OperationReportData.m_nRow) = 0;
  406. if ((m_OperationReportData.m_nRow) == (m_OperationReportData.m_nTopRow))
  407. {
  408. m_OperationReportData.m_bScrolled = TRUE;
  409. memset(&m_OperationReportData.m_pReportString[(m_OperationReportData.m_nTopRow)], ' ', sizeof(ReprtString));
  410. (m_OperationReportData.m_nTopRow)++;
  411. (m_OperationReportData.m_nScrolled)++;
  412. if (m_OperationReportData.m_nTopRow >= MAXROW) m_OperationReportData.m_nTopRow = 0;
  413. }
  414. SetSizes();
  415. MoveCursor(TRUE);
  416. HWND FirsthWnd = NULL;
  417. return TRUE;
  418. }
  419. BOOL CReportView::WriteReportLine(LPCSTR lpBlock, int Type, BOOL bShowTime)
  420. {
  421. return WriteReportLine(CString(lpBlock).GetBuffer(MAXCOL),Type,bShowTime);
  422. }