QLayerList.cpp
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:3k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // QLayerList.cpp: implementation of the CQLayerList class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "..stdafx.h"
  5. #include "..includeQLayerObj.h"
  6. #include "..includeQLayerList.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CQLayerList::CQLayerList()
  16. {
  17. }
  18. CQLayerList::~CQLayerList()
  19. {
  20. DeleteAll();
  21. }
  22. CQLayerList::CQLayerList(CQLayerList &List)
  23. {
  24. int nLayerCount = List.GetCount();
  25. if(nLayerCount == 0) return;
  26. RemoveAll();
  27. POSITION pos = List.GetHeadPosition();
  28. while (pos)
  29. {
  30. CQLayerObj * pLayer = new CQLayerObj(*(List.GetNext(pos)));
  31. AddTail((void *)pLayer);
  32. }
  33. }
  34. void CQLayerList::Add(CQLayerObj * pObject)
  35. {
  36. if(pObject)
  37. {
  38. CPtrList::AddTail(pObject);
  39. }
  40. }
  41. void CQLayerList::Delete(CQLayerObj * pObject)
  42. {
  43. if(!pObject) return;
  44. Remove(pObject);
  45. delete pObject;
  46. }
  47. void CQLayerList::Remove(CQLayerObj * pObject)
  48. {
  49. if(!pObject)return;
  50. POSITION pos = CPtrList::Find(pObject);
  51. if(pos)
  52. {
  53. RemoveAt(pos);
  54. }
  55. }
  56. void CQLayerList::DeleteAll()
  57. {
  58. while (!IsEmpty())
  59. {
  60. CQLayerObj * p = (CQLayerObj *)RemoveHead();
  61. if(p)
  62. delete p;
  63. }
  64. }
  65. CQLayerObj * CQLayerList::Find(long lLayerID)
  66. {
  67. int nCount = GetCount();
  68. POSITION pos = GetHeadPosition();
  69. while(pos)
  70. {
  71. CQLayerObj * p = (CQLayerObj *)GetNext(pos);
  72. if(p)
  73. {
  74. if(p->GetLayerID() == lLayerID)
  75. return p;
  76. }
  77. }
  78. return NULL;
  79. }
  80. void CQLayerList::Serialize(CArchive & ar)
  81. {
  82. if(ar.IsStoring())
  83. {
  84. CQLayerObj * pLayer = NULL;
  85. POSITION pos;
  86. pos = GetHeadPosition();
  87. //把有删除标志的对象删除
  88. while (pos)
  89. {
  90. pLayer = GetNext(pos);
  91. if(pLayer)
  92. {
  93. if(pLayer->GetDeleteFlag())
  94. Delete(pLayer);
  95. }
  96. }
  97. int nCount = GetCount();
  98. ar.Write(&nCount,sizeof(int));
  99. pos = GetHeadPosition();
  100. while (pos)
  101. {
  102. pLayer = GetNext(pos);
  103. if(pLayer)
  104. pLayer->Serialize(ar);
  105. }
  106. }
  107. else
  108. {
  109. int nCount = 0;
  110. ar.Read(&nCount,sizeof(int));
  111. CQLayerObj * pLayer = NULL;
  112. for(int i=0;i<nCount;i++)
  113. {
  114. pLayer = new CQLayerObj;
  115. pLayer->Serialize(ar);
  116. Add(pLayer);
  117. }
  118. }
  119. }
  120. inline CQLayerObj * CQLayerList::GetAt(POSITION& rPosition)
  121. {
  122. return (CQLayerObj *)(CPtrList::GetAt(rPosition));
  123. }
  124. inline POSITION CQLayerList::GetHeadPosition()
  125. {
  126. return (POSITION)CPtrList::GetTailPosition();
  127. }
  128. inline CQLayerObj * CQLayerList::GetNext(POSITION & rPosition)
  129. {
  130. return (CQLayerObj *)(CPtrList::GetNext(rPosition));
  131. }
  132. void CQLayerList::Copy(CQLayerList &List)
  133. {
  134. int nLayerCount = List.GetCount();
  135. if(nLayerCount == 0) return;
  136. RemoveAll();
  137. POSITION pos = List.GetHeadPosition();
  138. while (pos)
  139. {
  140. CQLayerObj * pLayer = new CQLayerObj(*(List.GetNext(pos)));
  141. AddTail((void *)pLayer);
  142. }
  143. }