ReportControl.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:4k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // ReportControl.cpp: implementation of the CReportControl class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MessageRecord.h"
  6. #include "ReportControl.h"
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10. CReportControl::CReportControl()
  11. {
  12. m_pFocusedRecord = NULL;
  13. m_pTopRow = NULL;
  14. }
  15. CReportControl::~CReportControl()
  16. {
  17. if(m_pFocusedRecord)
  18. m_pFocusedRecord = NULL;
  19. }
  20. /////////////////////////////////////////////////////////////////////////////
  21. // Message map
  22. BEGIN_MESSAGE_MAP(CReportControl, CXTPReportControl)
  23. //{{AFX_MSG_MAP(CReportControl)
  24. ON_WM_KEYDOWN()
  25. //}}AFX_MSG_MAP
  26. ON_MESSAGE(WM_ADD_RECORD_EX, OnAddRecordEx)
  27. END_MESSAGE_MAP()
  28. LRESULT CReportControl::OnAddRecordEx(WPARAM wParam, LPARAM /*lParam*/)
  29. {
  30. CXTPReportRecord* pRecord = (CXTPReportRecord*)wParam;
  31. if(!pRecord)
  32. return -1;
  33. // save top row
  34. if(GetRows())
  35. m_pTopRow = GetRows()->GetAt(GetTopRowIndex());
  36. // add record
  37. AddRecordEx(pRecord);
  38. // restore top row
  39. if(m_pTopRow)
  40. SetTopRow(m_pTopRow->GetIndex());
  41. RedrawControl();
  42. return 0;
  43. }
  44. void CReportControl::DeleteSelectedRows()
  45. {
  46. CXTPReportSelectedRows* pSelectedRows = GetSelectedRows();
  47. if(!pSelectedRows)
  48. return;
  49. int nRow = pSelectedRows->GetCount() - 1;
  50. if(nRow < 0)
  51. return;
  52. CWaitCursor wc;
  53. CXTPReportRow* pFocusedRow = pSelectedRows->GetAt(pSelectedRows->GetCount() - 1);
  54. pFocusedRow = GetRows()->GetAt(pFocusedRow->GetIndex() + 1);
  55. while(nRow >= 0)
  56. {
  57. CXTPReportRecord* pRecord = pSelectedRows->GetAt(nRow--)->GetRecord();
  58. if(pRecord)
  59. RemoveRecordEx(pRecord);
  60. if(nRow >= pSelectedRows->GetCount())
  61. nRow = pSelectedRows->GetCount() - 1;
  62. }
  63. SetFocusedRow(pFocusedRow ? pFocusedRow : GetFocusedRow());
  64. }
  65. void CReportControl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  66. {
  67. switch(nChar)
  68. {
  69. case VK_DELETE :
  70. DeleteSelectedRows();
  71. break;
  72. case VK_RETURN :
  73. CXTPReportRow* pFocusedRow = GetFocusedRow();
  74. if(pFocusedRow && pFocusedRow->GetType() == xtpRowTypeHeader && m_pFocusedRecord)
  75. {
  76. *(CMessageRecord*)m_pFocusedRecord = *(CMessageRecord*)pFocusedRow->GetRecord();
  77. m_pFocusedRecord->InternalAddRef();
  78. UpdateRecord(m_pFocusedRecord, FALSE);
  79. RedrawControl();
  80. }
  81. break;
  82. }
  83. CXTPReportControl::OnKeyDown(nChar, nRepCnt, nFlags);
  84. }
  85. BOOL CReportControl::OnFocusChanging(CXTPReportRow* pNewRow, CXTPReportColumn* pNewCol)
  86. {
  87. CXTPReportControl::OnFocusChanging(pNewRow, pNewCol);
  88. // apply changes
  89. CXTPReportRow* pFocusedRow = GetFocusedRow();
  90. if(pFocusedRow && pFocusedRow->GetType() == xtpRowTypeHeader && pNewRow != GetFocusedRow() && m_pFocusedRecord && pNewRow->GetType() != xtpRowTypeHeader)
  91. {
  92. *(CMessageRecord*)m_pFocusedRecord = *(CMessageRecord*)pFocusedRow->GetRecord();
  93. m_pFocusedRecord->InternalAddRef();
  94. UpdateRecord(m_pFocusedRecord, FALSE);
  95. RedrawControl();
  96. }
  97. // set new header row
  98. if(!pNewRow || pNewRow == GetFocusedRow() || pNewRow->GetType() == xtpRowTypeHeader)
  99. return TRUE;
  100. if(m_pFocusedRecord)
  101. m_pFocusedRecord = NULL;
  102. if(!pNewRow->GetRecord())
  103. {
  104. GetHeaderRecords()->RemoveAll();
  105. GetHeaderRecords()->Add(new CMessageRecord());
  106. PopulateHeaderRows();
  107. return TRUE;
  108. }
  109. m_pFocusedRecord = pNewRow->GetRecord();
  110. GetHeaderRecords()->RemoveAll();
  111. GetHeaderRecords()->Add(new CMessageRecord((CMessageRecord*)m_pFocusedRecord));
  112. PopulateHeaderRows();
  113. return TRUE;
  114. }