@@ -10,7 +10,7 @@ TreeNode::TreeNode() :
10
10
m_pTreeView (nullptr ),
11
11
m_pParentTreeNode (nullptr ),
12
12
m_iDepth (ROOT_NODE_DEPTH),
13
- mTreeNodes ()
13
+ m_aTreeNodes ()
14
14
{
15
15
16
16
}
@@ -37,9 +37,12 @@ void TreeNode::SetInternVisible(bool bVisible)
37
37
38
38
void TreeNode::SetWindow (Window* pManager, Box* pParent, bool bInit)
39
39
{
40
- for (auto it = mTreeNodes .begin (); it != mTreeNodes .end (); it++)
40
+ for (auto it = m_aTreeNodes .begin (); it != m_aTreeNodes .end (); it++)
41
41
{
42
- (*it)->SetWindow (pManager, this , bInit);
42
+ // 将所有子控件的父节点(GetParent)都设置为 TreeView 中隐藏的 TreeNode
43
+ // 在 TreeView 递归销毁子控件时不会因为获取不到父容器指针而崩溃
44
+ // RootNode 是一个智能指针,在 TreeView 完全销毁以后会自动销毁
45
+ (*it)->SetWindow (pManager, m_pTreeView->GetRootNode (), bInit);
43
46
}
44
47
45
48
ListContainerElement::SetWindow (pManager, pParent, bInit);
@@ -75,8 +78,8 @@ bool TreeNode::AddChildNode(TreeNode* pTreeNode)
75
78
76
79
bool TreeNode::AddChildNodeAt (TreeNode* pTreeNode, std::size_t iIndex)
77
80
{
78
- if ( iIndex < 0 || iIndex > mTreeNodes .size () ) return false ;
79
- mTreeNodes .insert (mTreeNodes .begin () + iIndex, pTreeNode);
81
+ if ( iIndex < 0 || iIndex > m_aTreeNodes .size () ) return false ;
82
+ m_aTreeNodes .insert (m_aTreeNodes .begin () + iIndex, pTreeNode);
80
83
81
84
pTreeNode->m_iDepth = m_iDepth + 1 ;
82
85
pTreeNode->SetParentNode (this );
@@ -95,50 +98,50 @@ bool TreeNode::AddChildNodeAt(TreeNode* pTreeNode, std::size_t iIndex)
95
98
std::size_t nGlobalIndex = iIndex;
96
99
for (std::size_t i = 0 ; i < iIndex; i++)
97
100
{
98
- nGlobalIndex += ((TreeNode*)mTreeNodes [i])->GetDescendantNodeCount ();
101
+ nGlobalIndex += ((TreeNode*)m_aTreeNodes [i])->GetDescendantNodeCount ();
99
102
}
100
103
101
104
return m_pTreeView->ListBox ::AddAt (pTreeNode, (int )(nodeIndex + nGlobalIndex + 1 ));
102
105
}
103
106
104
107
bool TreeNode::RemoveChildNodeAt (std::size_t iIndex)
105
108
{
106
- if (iIndex < 0 || iIndex >= mTreeNodes .size ()) {
109
+ if (iIndex < 0 || iIndex >= m_aTreeNodes .size ()) {
107
110
return false ;
108
111
}
109
112
110
- TreeNode* pTreeNode = ((TreeNode*)mTreeNodes [iIndex]);
111
- mTreeNodes .erase (mTreeNodes .begin () + iIndex);
113
+ TreeNode* pTreeNode = ((TreeNode*)m_aTreeNodes [iIndex]);
114
+ m_aTreeNodes .erase (m_aTreeNodes .begin () + iIndex);
112
115
113
116
return pTreeNode->RemoveSelf ();
114
117
}
115
118
116
119
bool TreeNode::RemoveChildNode (TreeNode* pTreeNode)
117
120
{
118
- auto it = std::find (mTreeNodes .begin (), mTreeNodes .end (), pTreeNode);
119
- if (it == mTreeNodes .end ()) {
121
+ auto it = std::find (m_aTreeNodes .begin (), m_aTreeNodes .end (), pTreeNode);
122
+ if (it == m_aTreeNodes .end ()) {
120
123
return false ;
121
124
}
122
125
123
- int iIndex = it - mTreeNodes .begin ();
126
+ int iIndex = it - m_aTreeNodes .begin ();
124
127
return RemoveChildNodeAt (iIndex);
125
128
}
126
129
127
130
void TreeNode::RemoveAllChildNode ()
128
131
{
129
- while (mTreeNodes .size () > 0 )
132
+ while (m_aTreeNodes .size () > 0 )
130
133
{
131
134
RemoveChildNodeAt (0 );
132
135
}
133
136
}
134
137
135
138
bool TreeNode::RemoveSelf ()
136
139
{
137
- for ( auto it = mTreeNodes .begin (); it != mTreeNodes .end (); it++ )
140
+ for ( auto it = m_aTreeNodes .begin (); it != m_aTreeNodes .end (); it++ )
138
141
{
139
142
(*it)->RemoveSelf ();
140
143
}
141
- mTreeNodes .clear ();
144
+ m_aTreeNodes .clear ();
142
145
143
146
if (m_iDepth != ROOT_NODE_DEPTH) {
144
147
return m_pTreeView->ListBox ::RemoveAt (GetIndex ());
@@ -150,7 +153,7 @@ bool TreeNode::RemoveSelf()
150
153
int TreeNode::GetDescendantNodeCount ()
151
154
{
152
155
int nodeCount = (int )GetChildNodeCount ();
153
- for ( auto it = mTreeNodes .begin (); it != mTreeNodes .end (); it++ )
156
+ for ( auto it = m_aTreeNodes .begin (); it != m_aTreeNodes .end (); it++ )
154
157
{
155
158
nodeCount += (*it)->GetDescendantNodeCount ();
156
159
}
@@ -160,22 +163,22 @@ int TreeNode::GetDescendantNodeCount()
160
163
161
164
std::size_t TreeNode::GetChildNodeCount ()
162
165
{
163
- return mTreeNodes .size ();
166
+ return m_aTreeNodes .size ();
164
167
}
165
168
166
169
TreeNode* TreeNode::GetChildNode (std::size_t iIndex)
167
170
{
168
- if ( iIndex < 0 || iIndex >= mTreeNodes .size () ) return NULL ;
169
- return static_cast <TreeNode*>(mTreeNodes [iIndex]);
171
+ if ( iIndex < 0 || iIndex >= m_aTreeNodes .size () ) return NULL ;
172
+ return static_cast <TreeNode*>(m_aTreeNodes [iIndex]);
170
173
}
171
174
172
175
int TreeNode::GetChildNodeIndex (TreeNode* pTreeNode)
173
176
{
174
- auto it = std::find (mTreeNodes .begin (), mTreeNodes .end (), pTreeNode);
175
- if (it == mTreeNodes .end ()) {
177
+ auto it = std::find (m_aTreeNodes .begin (), m_aTreeNodes .end (), pTreeNode);
178
+ if (it == m_aTreeNodes .end ()) {
176
179
return -1 ;
177
180
}
178
- return it - mTreeNodes .begin ();
181
+ return it - m_aTreeNodes .begin ();
179
182
}
180
183
181
184
bool TreeNode::IsExpand () const
0 commit comments