SplitterWnd functionality in CPropertyPages
Simon Coghlan -- coghlans@sharelink.com
Friday, February 07, 1997
Environment: NT 4.0 WIN 95 VC++ 4.2b
I need a little help / Guidance on the following scenario..
I have an app that consists entirely of a CPropertySheet as the main =
app, that can be resized at run time to show a page to the users Size =
requirements..
On one of the pages it would be nice to embed a CTreeCtrl and CListCtrl =
into a CSplitterWnd with two panes..
What I need is a way of doing it that works with the CPropertySheet as =
the main app..
It appears that all the CSplitterWnd wants are Views and an =
OnCreateXXXXX thing to initialise against.. As this is a CPropertySheet =
with CPropertyPages ( which are based upon Dialogs that do not have =
OnCreateXXXXX funcionality available { breaks points do not get called } =
) I need some way of setting two panes ( one with a TreeCtrl and the =
other with the ListCtrl ) in the OnInitDialog of the CPropertySheet.=20
I have looked at Split32 available on the MSDN and attempted to =
implement that, but that just fails without showing anything..
So the Question is, Has anybody inserted a CSplitterWnd into a CDiolog =
type situation without CViews or MDI/SDI functionality..
---------
Simon=20
----------<- Smurf-IV ->-------------
Tel : 0121 200 7713
Fax : +44 (0)121 212 0379
Email smurf-iv@sharelink.com
Member of the 'Team of CIS' ;-)
---------<- Fun To All ->------------
We are what we repeatedly do, Excellence, then, is not an act, but a =
habit.
Aristotle
The one who says it cannot be done, should never interrupt the one who =
is doing it.
The Roman Rule
Stuart Downing -- sdowning@fame.com
Monday, February 10, 1997
[Mini-digest: 2 responses]
The child panes of CSplitterWnd are only optionally CView derivatives. =
You
can use any CWnd derived window. I assume the OnCreateXXXXX you
are referring to is the CCreateContext object. You only need this
if you want CSplitterWnd to automatically associate your view (if you're
creating views) with a document. (Sounds like you can pass in NULL for =
this)
Create your two window classes for the two panes. They should be=20
declared DYNCREATE, because CSplitterWnd will create the child windows
for you. Use the CreateView function (once for each window), passing in =
the RUNTIME_CLASS of your pane classes to create the panes.
I've only used CSplitterWnd in the context of a CView, but I don't see
any reason why it can't be used as a child of a CDialog.
-----
Stuart Downing
sdowning@fame.com
FAME Information Services, Inc.
----------
From: coghlans[SMTP:coghlans@sharelink.com]
Subject: SplitterWnd functionality in CPropertyPages
Environment: NT 4.0 WIN 95 VC++ 4.2b
It appears that all the CSplitterWnd wants are Views and an =
OnCreateXXXXX thing to initialise against.. As this is a CPropertySheet =
with CPropertyPages ( which are based upon Dialogs that do not have =
OnCreateXXXXX funcionality available { breaks points do not get called } =
) I need some way of setting two panes ( one with a TreeCtrl and the =
other with the ListCtrl ) in the OnInitDialog of the CPropertySheet.=20
-----From: "brianw"
Simon,
I don't know about using a splitter in a dialog/property page, but, maybe
this information will help.
After your call to the Create() or CreateStatic() member of CSplitterWnd
one must create a "view", that much is true, however, I have found that
CreateView() doesn't _need_ to take a CView derived class. It can, instead
take a derived class of CFrameWnd, such as in the following:
if (!m_wndSplitter1.CreateView(0, 0,
RUNTIME_CLASS( CFrameFolders ), size, pContext))
{
TRACE0("Failed to create first pane\n");
return FALSE;
}
In the case of my application, my CFrameFolders is derived from CFrameWnd
and has a member of m_treeFolders which is a CTreeCtrl.
I know we aren't supposed to give answers like this but, I recall recently
seeing some messages on the subject of splitters and dialogs in the news
group microsoft.public.vc.mfc, if you have access try looking there.
Hope this is of some help.
-------------------
Brian Welsh
brianw@i1.net
http://www.i1.net/~brianw
----------
>
> Environment: NT 4.0 WIN 95 VC++ 4.2b
>
> I need a little help / Guidance on the following scenario..
>
> I have an app that consists entirely of a CPropertySheet as the main app,
that
> can be resized at run time to show a page to the users Size requirements..
>
> On one of the pages it would be nice to embed a CTreeCtrl and CListCtrl
into a
> CSplitterWnd with two panes..
>
> What I need is a way of doing it that works with the CPropertySheet as the
> main app..
>
> It appears that all the CSplitterWnd wants are Views and an OnCreateXXXXX
> thing to initialise against.. As this is a CPropertySheet with
CPropertyPages
> ( which are based upon Dialogs that do not have OnCreateXXXXX funcionality
> available { breaks points do not get called } ) I need some way of
setting two
> panes ( one with a TreeCtrl and the other with the ListCtrl ) in the
> OnInitDialog of the CPropertySheet.
>
> I have looked at Split32 available on the MSDN and attempted to implement
> that, but that just fails without showing anything..
>
> So the Question is, Has anybody inserted a CSplitterWnd into a CDiolog
type
> situation without CViews or MDI/SDI functionality..
>
> ---------
> Simon
> ----------<- Smurf-IV ->-------------
> Tel : 0121 200 7713
> Fax : +44 (0)121 212 0379
> Email smurf-iv@sharelink.com
> Member of the 'Team of CIS' ;-)
> ---------<- Fun To All ->------------
> We are what we repeatedly do, Excellence, then, is not an act, but a
habit.
> Aristotle
> The one who says it cannot be done, should never interrupt the one who is
> doing it.
> The Roman Rule
>
>
>
>
>
>
Simon Coghlan -- coghlans@sharelink.com
Wednesday, February 12, 1997
> [Mini-digest: 2 responses]
> The child panes of CSplitterWnd are only optionally CView derivatives. =
You
> can use any CWnd derived window. I assume the OnCreateXXXXX you
> are referring to is the CCreateContext object. =20
No I was referring to the OnCreateDialog and relation to OnInitDialog.. =
The OnCreateContext is not given via the wizard so might be not =
available to the us mere mortals..
=20
> You only need this if you want CSplitterWnd to automatically associate =
your view (if you're
> creating views) with a document. (Sounds like you can pass in NULL =
for this)
This caused an unhandled assertion with the following Call Stack : -
CFrameWnd::GetActiveView() line 1242 + 3 bytes
CSplitterWnd::GetActivePane(int * 0x00000000, int * 0x00000000) line =
2263 + 8 bytes
CSplitterWnd::CreateView(int 0, int 1, CRuntimeClass * 0x00406640 =
{"CLogFileTreeCtl"}, tagSIZE {...}, CCreateContext * 0x00000000) line =
270 + 18 bytes
CDialog_SplitterDlg::OnCreate(tagCREATESTRUCTA * 0x0012fb24) line 190
Its trying to get the context via the active view.. There are no views =
this is a Dialog..
> Create your two window classes for the two panes. They should be=20
> declared DYNCREATE, because CSplitterWnd will create the child windows
> for you. Use the CreateView function (once for each window), passing =
in=20
> the RUNTIME_CLASS of your pane classes to create the panes.
> I've only used CSplitterWnd in the context of a CView, but I don't see
> any reason why it can't be used as a child of a CDialog.
Here is the code segment that produces the above dump..
int CDialog_SplitterDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)=20
{
if (CDialog::OnCreate(lpCreateStruct) =3D=3D -1)
return -1;
=09
m_Splitter.CreateStatic( this, 1, 2 );
SIZE size; =20
CRect rect; =20
GetClientRect(&rect); =20
size.cx=3Drect.right/2;
size.cy=3Drect.bottom;
m_Splitter.CreateView(0,1,RUNTIME_CLASS(CLogFileTreeCtl),size, NULL);
m_Splitter.CreateView(0,0,RUNTIME_CLASS(CLogFileTreeCtl),size, NULL);
=20
m_Splitter.ShowWindow(SW_SHOWNORMAL);
m_Splitter.UpdateWindow();
=09
return 0;
}=20
No Compilations errors are encountered ( even on level 4 )..
So what am I missing.. This does not appear to be as simple as one seems =
upon first glance..
-----
coghlans[SMTP:coghlans@sharelink.com]
Subject: SplitterWnd functionality in CPropertyPages
Environment: NT 4.0 WIN 95 VC++ 4.2b
It appears that all the CSplitterWnd wants are Views and an =
OnCreateXXXXX thing to initialise against.. As this is a CPropertySheet =
with CPropertyPages ( which are based upon Dialogs that do not have =
OnCreateXXXXX funcionality available { breaks points do not get called } =
) I need some way of setting two panes ( one with a TreeCtrl and the =
other with the ListCtrl ) in the OnInitDialog of the CPropertySheet.=20
So the Question is, Has anybody inserted a CSplitterWnd into a CDiolog
type situation without CViews or MDI/SDI functionality..
=20
Stuart Downing -- sdowning@fame.com
Thursday, February 13, 1997
>----------
From: coghlans[SMTP:coghlans@sharelink.com]
>Sent: Wednesday, February 12, 1997 10:36 AM
>
>> The child panes of CSplitterWnd are only optionally CView derivatives. =
> You
>> can use any CWnd derived window. I assume the OnCreateXXXXX you
>> are referring to is the CCreateContext object. =20
>
>No I was referring to the OnCreateDialog and relation to OnInitDialog.. =
CCreateContext is a structure that you declare, initialize
and hand over to MFC so that when it creates CViews for you,
it will hook them to the appropriate CDocuments. I don't think
you want to derive your panes from CView (see below) so you
shouldn't have to care about this.
I think by "OnCreateDialog" you mean "CMyDialog::OnCreate"
(the handler for the WM_CREATE message)
>The OnCreateContext is not given via the wizard so might be not =
>available to the us mere mortals..
>=20
MFC doesn't have any "OnCreateContext" methods.
I have to put my pants on one leg at a time, just like everyone else. :)
(Please, no offense, ladies)
[Moderator's note: Also, no offense to really dumb people who have
to put their pants on one arm at a time...]
>This caused an unhandled assertion with the following Call Stack : -
>CFrameWnd::GetActiveView() line 1242 + 3 bytes
>CSplitterWnd::GetActivePane(int * 0x00000000, int * 0x00000000) line =
>2263 + 8 bytes
>CSplitterWnd::CreateView(int 0, int 1, CRuntimeClass * 0x00406640 =
>{"CLogFileTreeCtl"}, tagSIZE {...}, CCreateContext * 0x00000000) line =
>270 + 18 bytes
>CDialog_SplitterDlg::OnCreate(tagCREATESTRUCTA * 0x0012fb24) line 190
>
>Its trying to get the context via the active view.. There are no views =
>this is a Dialog..
Hmmm. Take a look at WINSPLIT.CPP and search for all the calls
to GetParentFrame, (which is causing your trouble, since you're
not a child of a frame). You should see that it's called in
the following methods...
* StartTracking - prechecks that pane is CView derived before calling
so don't derive your panes from CView
* OnCommand - Virtual so you can override it. You probably want to
override this and just call CDialog::OnCommand
* OnNotify - Same story as OnCommand
* SetActivePane - Same as StartTracking
* GetActivePane - Virtual. Override. Involves some
work to understand what the requirements are of this method
in various contexts. This exercise is left to the reader. :)
Create a new window class derived from CSplitterWnd and override
as described above. Use this in your dialog.
>So what am I missing.. This does not appear to be as simple as one seems =
>upon first glance..
Same thing I was missing. CSplitterWnd was written with a CFrameWnd
parent in mind, but it's not out the question that you can get
it to work in the context of a dialog. You might not be out of
the woods yet. There may be some other parent-frame assumptions
built into the code that are less obvious that I'm missing.
-----
Stuart Downing
sdowning@fame.com
FAME Information Services, Inc.
Become an MFC-L member
| Вернуться в корень Архива
|