Re: CSplitterWnd; create; WM_SIZE. Bug??
Looks like you may be creating the static splitter incorrectly.
Are you creating the panes right after the CreateStatic() call?
from the docs:
"When you create a static splitter window, you must at the same time create
all its panes."
Mark
--
Mark Salsbery
Microsoft MVP - Visual C++
"Arman Sahakyan" <armancho_x@rambler.ru(donotspam)> wrote in message
news:D6D64324-8C7B-43B1-A90A-9ADE8BA82448@microsoft.com...
Hi,
My CMainFrame has a splitter wnd created (CreateStatic) inside
OnCreateContext. When I'm trying to set its column info inside WM_SIZE
handler (on CMainFrame) it causes an access violation ;
// inside WM_SIZE handler
if (m_wndSplitter.GetSafeHwnd() != NULL) {
m_wndSplitter.SetColumnInfo(0, X, Y);
}
The reason is that inside SetColumnInfo, the m_pColIfno pointer is NULL
because it has not been intitalized yet even though the splitter is a
'valid
window' i.e.(IsWindow==TRUE).
The problem is that the first post to WM_SIZE is caused inside the
CSplitterWnd::CreateStatic method when it is trying to create the window,
and
afterwards, it is trying to allocate memory for m_pColInfo [which turns
out
is needed when CreateEx returns];
( from CSplitterWnd::CreateCommon [called by CreateStatic] )
// create with the same wnd-class as MDI-Frame (no erase bkgnd)
if (!CreateEx(0, _afxWndMDIFrame, NULL, dwCreateStyle, 0, 0, 0, 0,
pParentWnd->m_hWnd, (HMENU)(UINT_PTR)nID, NULL))
return FALSE; // create invisible
// attach the initial splitter parts
TRY
{
m_pColInfo = new CRowColInfo[m_nMaxCols];
My question is whether this is not a buggy situation; instead it would be
better to init m_pColInfo before CreateEx [and delete it in case of
failure]
IMO.
To overcome, I had to use an extra field to check whether CreateStatic has
returned or not;
// inside OnCreateClient
m_bMainSplitterReady = FALSE;
if (!m_wndSplitterExplore.CreateStatic(...))
{
return FALSE;
}
m_bMainSplitterReady = TRUE;
And inside the WM_SIZE handler;
if (m_wndSplitter.GetSafeHwnd() != NULL && m_bMainSplitterReady) {
m_wndSplitter.SetColumnInfo(0, X, Y);
}
So it's interesting to hear from you...
Thanks.
--
=====
Arman
An internal error has occured while showing an internal error!
-- eclipse