Re: How Can I Save position of toolbars in an MDI application?
"Electronic75" <Electronic75@discussions.microsoft.com> wrote in message
news:A52C7AF5-171A-4A45-96E4-7BC43937F198@microsoft.com...
Hello, I want to save docking position of toolbars in a MDI application
and
reterive it at begining of program.
I used SavebarState and LoadBarState but it dose not work when I use
LoadBarState before DockControlBar it gives an assertion failure then
crashes due to bad pointer....
I have an MDI application with lots of toolbars. In the past I have found
the MFC toolbar stuff to be a bit flakey - well very sensitive to various
things which are easy to do. :-) I *have* had problems from time to
time, but with care it works.
I use
SaveBarState( _T("Toolbar") );
(very early) in CMainFrame::OnClose() immediately after saving the
window-placement of the frame window. I doubt this is your problem. More
likely is toolbar initialisation.
In CMainFrame::Create() I have
==============
// frmToolBarsCreate() goes through all the toolbars
// typically using CToolBar::CreateEx() and either
// CToolBar::LoadToolBar() or both
// CToolbar::LoadBitmap() and CToolbar::SetButtons()
// on each. It returns the number of toolbars, or -1
// if there's a nasty error.
int nCreate = frmToolBarsCreate();
if( nCreate<0 ) return nCreate;
// Now enable docking of the tool bars on any side.
//
// Call the CMainFrame::EnableDocking() for the frame
//
EnableDocking( CBRS_ALIGN_ANY );
// frmToolBarsDockInDefaultPositions() now
// gets a rectangle, and calls DockControlBar()
// and RecalcLayout() for each toolbar.
frmToolBarsDockInDefaultPositions();
// Set the tool bar positions:
//
// This crashes if there are too many tool bars but seems to be ok
// if we catch the exception.
try
{
LoadBarState( _T("ToolBar") );
}
catch(...)
{
AfxMessageBox( IDS_FOREIGNTOOLBAR, MB_OK|MB_ICONEXCLAMATION );
}
=============
I have assorted derived classes for toolbars which do non-standard things
(like appearing as a piano keyboard; responding to right clicks, and
probably a few more). Which is the main reason for separating different
things into different members CMainFrame::frm....() - otherwise it just gets
too long and unmanageable.
Now the things which can screw up:
1. If the toolbars in the registry do not correspond with the number you're
actually loading it can be a mess.
If in doubt, go in with regedit and remove the whole toolbar section, both
from HKCU and HKLM! so you're starting with a clean system.
2. Tool bar IDs are apparently extremely important. In afxres.h() there is
useful advice, in amongst some #defines :-)
// Standard control bars (IDW = window ID)
#define AFX_IDW_CONTROLBAR_FIRST 0xE800
#define AFX_IDW_CONTROLBAR_LAST 0xE8FF
#define AFX_IDW_TOOLBAR 0xE800 // main Toolbar for window
#define AFX_IDW_STATUS_BAR 0xE801 // Status bar window
#define AFX_IDW_PREVIEW_BAR 0xE802 // PrintPreview Dialog Bar
#define AFX_IDW_RESIZE_BAR 0xE803 // OLE in-place resize bar
#define AFX_IDW_REBAR 0xE804 // COMCTL32 "rebar" Bar
#define AFX_IDW_DIALOGBAR 0xE805 // CDialogBar
// Note: If your application supports docking toolbars, you should
// not use the following IDs for your own toolbars. The IDs chosen
// are at the top of the first 32 such that the bars will be hidden
// while in print preview mode, and are not likely to conflict with
// IDs your application may have used succesfully in the past.
#define AFX_IDW_DOCKBAR_TOP 0xE81B
#define AFX_IDW_DOCKBAR_LEFT 0xE81C
#define AFX_IDW_DOCKBAR_RIGHT 0xE81D
#define AFX_IDW_DOCKBAR_BOTTOM 0xE81E
#define AFX_IDW_DOCKBAR_FLOAT 0xE81F
===========
I leave my first toolbar ID to be AFX_IDW_TOOLBAR and keep the others not
just in the range AFX_IDW_CONTROLBAR_FIRST to AFX_IDW_CONTROLBAR_LAST but in
the range AFX_IDW_CONTROLBAR_FIRST to
AFX_IDW_CONTROLBAR_FIRST+31 (as I'm not sure what the print preview comment
means) avoiding like the plague anything which has been defined above!
This all seems to matter rather a lot!
Hope it helps,
Dave
--
David Webber
Author of 'Mozart the Music Processor'
http://www.mozart.co.uk
For discussion/support see
http://www.mozart.co.uk/mzusers/mailinglist.htm
CMainFrame::OnCreate(...)
{
...
//This code crashes
EnableDocking(CBRS_ALIGN_TOP);
m_ToolBar1.EnableDocking(CBRS_ALIGN_ANY);
m_ToolBar2.EnableDocking(CBRS_ALIGN_ANY);
m_ToolBar3.EnableDocking(CBRS_ALIGN_ANY);
LoadBarState(_T("Main ToolBar Docking Position"));
DockControlBar(m_ToolBar1);
DockControlBar(m_ToolBar2);
DockControlBar(m_ToolBar3);
}
when I put LoadBarState after DockControlBar it dose not crashes or give
assertion failure but position of toolbars are not the position when
prgram
has been closed.
CMainFrame::OnCreate(...)
{
...
//This code dose not crash but it dose not save position of toolbars
EnableDocking(CBRS_ALIGN_TOP);
m_ToolBar1.EnableDocking(CBRS_ALIGN_ANY);
m_ToolBar2.EnableDocking(CBRS_ALIGN_ANY);
m_ToolBar3.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(m_ToolBar1);
DockControlBar(m_ToolBar2);
DockControlBar(m_ToolBar3);
LoadBarState(_T("Main ToolBar Docking Position"));//<<
}
toolbar position is saved in OnClose
OnClose()
{
SaveBarState(_T("Main ToolBar Docking Position"));
}
can someone figure out what's the problem, thanks.