Copying a CTreeCtrl
Jesper Spring -- jesper_spring@Merck.Com
Thursday, February 22, 1996
Hi there,
OK, here's the deal. I have created a CTreeCtrl in one of my splitter views.
Also I have created a CTreeCtrl in my MainFrame Document. When the view with
the CTreeCtrl is destroyed I would like to copy the tree structure to the
CTreeCtrl member in the MainFrame document for later serialization. I have
tried this:
void CMySplitterTreeView::OnDestroy()
{
// Update Tree Structure to Mainframe document
CMainFrameDoc* pDoc = (CMainFrameDoc*) GetDocument();
UpdateData(TRUE);
pDoc->m_Tree = m_Tree;
GetDocument()->SetModifiedFlag();
}
The problem is that its not possible to copy a tree structure as above. Any
suggestions? Is there a smarter way of doing this? Is there anyway I can
detect and copy the tree every time it changes - I haven't been able to find
a message to respond to?
Thanks very much in advance
Jesper Honig Spring
Merck & Co., Inc.
Denmark
*** Standard Disclaimer ***
Mike Blaszczak -- mikeblas@interserv.com
Saturday, February 24, 1996
On Thu, 22 Feb 1996, jesper_spring@Merck.Com (Jesper Spring) wrote:
>void CMySplitterTreeView::OnDestroy()
>{
> // Update Tree Structure to Mainframe document
> CMainFrameDoc* pDoc = (CMainFrameDoc*) GetDocument();
> UpdateData(TRUE);
> pDoc->m_Tree = m_Tree;
> GetDocument()->SetModifiedFlag();
>}
>
>The problem is that its not possible to copy a tree structure as above.
I can't understand what you're doing from the code fragment above. What is
m_Tree? Is it a CTreeCtrl object? Or is it something else?
If it's a CTreeCtrl, you're right--you can't copy the data of a Windows
control just by copying one instance of the MFC wrapping class to another.
You'll need to traverse the content of the tree yourself. You can do so in a
loop using the CTreeCtrl::GetNextItem() function.
>Is there anyway I can
>detect and copy the tree every time it changes - I haven't been able to find
>a message to respond to?
I don't think there's a generic "This control has changed from an unknown
source" message. That would be a pretty impressive message--how would it tell
you exactly what has changed? It sure would be sent pretty often, huh?
What in your application causes the tree to change? Maybe you should just
respond to those things indirectly, or broadcast notifications of your own.
>Thanks very much in advance
How do you know my answer won't suck?
.B ekiM
--
TCHAR sCool[]=_T("What was Fonzie like? What was Fonzie like? Cool, right?");
Tim Philip -- philip@cs.usask.ca
Monday, February 26, 1996
[Mini-digest: 2 responses]
Jesper Spring writes:
>
> OK, here's the deal. I have created a CTreeCtrl in one of my splitter views.
> Also I have created a CTreeCtrl in my MainFrame Document. When the view with
> the CTreeCtrl is destroyed I would like to copy the tree structure to the
> CTreeCtrl member in the MainFrame document for later serialization. I have
> tried this:
>
> void CMySplitterTreeView::OnDestroy()
> {
> // Update Tree Structure to Mainframe document
> CMainFrameDoc* pDoc = (CMainFrameDoc*) GetDocument();
> UpdateData(TRUE);
> pDoc->m_Tree = m_Tree;
> GetDocument()->SetModifiedFlag();
> }
>
> The problem is that its not possible to copy a tree structure as above. Any
> suggestions? Is there a smarter way of doing this? Is there anyway I can
> detect and copy the tree every time it changes - I haven't been able to find
> a message to respond to?
>
I'm not quite sure I understand *why* you are doing this, but here's a way
you can try. Use pointers to CTreeCtrl's instead of objects. When you
go to this OnDestroy function you just assign a pointer instead of trying
to copy the whole tree. This requires that you change both your document
and your view to contain (CTreeCtrl *) rather than (CTreeCtrl).
-------
Tim Philip, B.Sc. Randco Software Corporation
Consultant 2530 Hanover Avenue
Saskatoon, SK Phone: +1-306-343-3380
philip@cs.usask.ca Canada S7J 1G1 Fax: +1-306-343-3341
-----From: pmoss@oxygen.bbn.com (Peter Moss)
I have been working on a similar problem although my problem is that I need to
maintain a hierarchical list that may appear in in many different dialogs.
When these different dialogs pop up, I want the tree to open up in the state
the user left it in from the previous dlg. What makes this problem a bear is
that there may be 3,000-90,000 entries in it. It is very time consuming to
load this control.
The approach I took (and one that you may end up having to deal with) is
maintaining the state of the tree outside the control itself. (In your case
you maybe can save the state in the control and then copy the state in
OnDestroy as you indicated in your msg. Another reader repsonded that you
can't just copy the instance of a control. He is absolutely right.
The trick in maintaining the state is to respond to TVN_ITEMEXPANDING and
TVN_ITEMEXPANDED notifications. In fact, because of the large number of tree
elements, I load branches in response to TVN_ITEMEXPANDING and remove them
using a
Expand(pNMTreeView->itemNew.hItem, TVE_COLLAPSE | TVE_COLLAPSERESET);
in the response func for TVN_ITEMEXPANDED. There is an article on the MSDN CD
that discusses this kind of CTreeCtrl memory management. What you'll need to
do is figure out a way to represent your hierarchy and the state it's in (if
that's important to you), and then copy that to the new instance of your
control.
Good luck,
Pete Moss
| Вернуться в корень Архива
|