Serializing dynamically created controls
Ed Kaltenbach -- kaltenba@ataway.aptec.com
Wednesday, March 27, 1996
Hello All,
I am using MSVC++ 4.0 on Windows 95
My view is derived from CView. I allow the user "build"
a display by adding both OLE and standard Controls to
the view at runtime.
I have derived a class from CWnd called CNewControl.
CNewControl has a m_nType variable and a few additional
methods (ShowPropertySheet,etc). All of the dynamically
created controls are of type CNewControl.
When a control is added my view does something like:
CNewControl *my_control;
my_control = new CNewControl();
my_control->Create(type,"sometext", WS_CHILD | WS_VISIBLE,
CRect(x,y,w,h),this, id);
m_controlList.AddTail(my_control);
I keep all of the controls in a CObList called m_controlList.
I am having problems when I attempt to serialize/deserialize.
I assume that the serialize method in CNewControl will need
to call Create for each control when deserializing. This
class doesn't have anything to pass as the parent window
to Create. I attempted to get the current view, but this
causes an ASSERT. I assume because the view doesn't exists yet
or has not become the current.
How can I deserialize and Create() something derived from CWnd?
When do I call each specific control's Serialize to save the
control's properties? ie CButton::Serialize()
Can I call CWnd::Serialize(ar) to serialize the OCXs?
Does anybody have any ideas or can point me in the right direction?
Thanks,
Ed Kaltenbach
---------------------------------------------------------------
Ed Kaltenbach Email: kaltenba@ataway.aptec.com
---------------------------------------------------------------
CraigTT_at_USNELMIS@ccmail01.PE-Nelson.COM
Monday, April 01, 1996
Ed,
I think the place where you want to create your controls is in the View's
OnInitialUpdate function. At that point, your m_controlList item should have
deserialized the information about the controls and the view exists waiting to
be updated with the information.
It doesn't appear to me that any of the Window's control wrappers, CButton, etc,
Serialize anything. You'll probably need to create your own classes for these
to store enough information to recreate them.
Tim Craig
PE-Nelson
______________________________ Reply Separator _________________________________
Subject: Serializing dynamically created controls
Author: mfc-l@netcom.com at SMTPLINK-PEN
Date: 3/27/96 9:21 AM
Hello All,
I am using MSVC++ 4.0 on Windows 95
My view is derived from CView. I allow the user "build"
a display by adding both OLE and standard Controls to
the view at runtime.
I have derived a class from CWnd called CNewControl.
CNewControl has a m_nType variable and a few additional
methods (ShowPropertySheet,etc). All of the dynamically
created controls are of type CNewControl.
When a control is added my view does something like:
CNewControl *my_control;
my_control = new CNewControl();
my_control->Create(type,"sometext", WS_CHILD | WS_VISIBLE,
CRect(x,y,w,h),this, id);
m_controlList.AddTail(my_control);
I keep all of the controls in a CObList called m_controlList.
I am having problems when I attempt to serialize/deserialize.
I assume that the serialize method in CNewControl will need
to call Create for each control when deserializing. This
class doesn't have anything to pass as the parent window
to Create. I attempted to get the current view, but this
causes an ASSERT. I assume because the view doesn't exists yet
or has not become the current.
How can I deserialize and Create() something derived from CWnd?
When do I call each specific control's Serialize to save the
control's properties? ie CButton::Serialize()
Can I call CWnd::Serialize(ar) to serialize the OCXs?
Does anybody have any ideas or can point me in the right direction?
Thanks,
Ed Kaltenbach
---------------------------------------------------------------
Ed Kaltenbach Email: kaltenba@ataway.aptec.com
---------------------------------------------------------------
Mike Blaszczak -- mikeblas@msn.com
Wednesday, April 03, 1996
Tim is right: you'll need to recreate your controls after the document is
loaded. The problem is that there's no way for you to create controls until
the view they'll live in has been created. During the loading serialization
of the document, there is no view. During the real serialization, you should
load all the information you need: the styles, the postions, and any other
attributes you can think of.
I don't think you'll need to create a wrapper class for each of the control
classes you'll want to serialize, though--you should be able to write just one
class that owns the control type in question and is capable of serializing it.
That is, I think you could augment your CNewControl a little to get the
functionality you want.
I think your view should update the list of controls in the document to
reflect any changes exactly as they are made to the control. Then, any time
the document needs to be stored, it will have current information that it can
correctly save.
> Can I call CWnd::Serialize(ar) to serialize the OCXs?
To write OLE controls, yes... this will work. Loading the controls from a
serialized data source isn't quite as easy, though. You'll need to use the
pStorage parameter to CWnd::CreateControl(), which, I'm afraid, is almost
completely undocumented.
.B ekiM
TCHAR sz[] = _T("All I want to do is zoom, zoom, zoom.");
----------
From: owner-mfc-l@netcom.com on behalf of
CraigTT_at_USNELMIS@ccmail01.PE-Nelson.COM
Sent: Monday, April 01, 1996 10:09 AM
To: mfc-l@netcom.com
Subject: Re: Serializing dynamically created controls
Ed,
I think the place where you want to create your controls is in the View's
OnInitialUpdate function. At that point, your m_controlList item should have
deserialized the information about the controls and the view exists waiting to
be updated with the information.
It doesn't appear to me that any of the Window's control wrappers, CButton,
etc,
Serialize anything. You'll probably need to create your own classes for these
to store enough information to recreate them.
Tim Craig
PE-Nelson
______________________________ Reply Separator
_________________________________
Subject: Serializing dynamically created controls
Author: mfc-l@netcom.com at SMTPLINK-PEN
Date: 3/27/96 9:21 AM
Hello All,
I am using MSVC++ 4.0 on Windows 95
My view is derived from CView. I allow the user "build"
a display by adding both OLE and standard Controls to
the view at runtime.
I have derived a class from CWnd called CNewControl.
CNewControl has a m_nType variable and a few additional
methods (ShowPropertySheet,etc). All of the dynamically
created controls are of type CNewControl.
When a control is added my view does something like:
CNewControl *my_control;
my_control = new CNewControl();
my_control->Create(type,"sometext", WS_CHILD | WS_VISIBLE,
CRect(x,y,w,h),this, id);
m_controlList.AddTail(my_control);
I keep all of the controls in a CObList called m_controlList.
I am having problems when I attempt to serialize/deserialize.
I assume that the serialize method in CNewControl will need
to call Create for each control when deserializing. This
class doesn't have anything to pass as the parent window
to Create. I attempted to get the current view, but this
causes an ASSERT. I assume because the view doesn't exists yet
or has not become the current.
How can I deserialize and Create() something derived from CWnd?
When do I call each specific control's Serialize to save the
control's properties? ie CButton::Serialize()
Can I call CWnd::Serialize(ar) to serialize the OCXs?
Does anybody have any ideas or can point me in the right direction?
Thanks,
Ed Kaltenbach
---------------------------------------------------------------
Ed Kaltenbach Email: kaltenba@ataway.aptec.com
---------------------------------------------------------------
| Вернуться в корень Архива
|