|
|
1. Include the following files in your project:
sizecbar.h sizecbar.cpp scbarg.h scbarg.cpp
2. Add these lines to your stdafx.h
(if the files are in a
different directory, include the path - see the stdafx.h
file in
the samples):
#include "sizecbar.h" #include "scbarg.h"
3. Derive a class from CSizingControlBarG
(you have an example
in mybar.*
files).
4. In mainfrm.h
, include your class' header:
#include "mybar.h"
then add a member variable to CMainFrame
: CMyBar m_wndMyBar;
5. Create the bar in CMainFrame::OnCreate(). Then set bar styles, enable it to dock... like any control bar.
if (!m_wndMyBar.Create(_T("My Bar"), this, 123) { TRACE0("Failed to create mybar\n"); return -1; // fail to create } m_wndMyBar.SetBarStyle(m_wndMyBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndMyBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndMyBar, AFX_IDW_DOCKBAR_LEFT);
The instructions above will make a docking bar with a DevStudio-like gripper (with 2 raised lines and a hide button) when docked, and with no gripper when floating.
Let's explore some advanced features. Now we will use the
CSizingControlBarCF
class as a base class, and will hide the
miniframe caption, showing the gripper in the floating state too. That's
possible, because CSizingControlBarCF
's gripper looks like a small
caption. As a side effect of using a custom miniframe class, the resizing of the
floating bar will be dynamic if "Show window contents while dragging" display
property is enabled.
1. Add these files to your project too:
scbarcf.h scbarcf.cpp
2. Change the stdafx.h
file to look like this:
#define _SCB_REPLACE_MINIFRAME #include "sizecbar.h" #include "scbarg.h" #include "scbarcf.h" #define baseCMyBar CSizingControlBarCF
3. Add these lines in CMainFrame::OnCreate()
, after the
EnableDocking()
call
#ifdef _SCB_REPLACE_MINIFRAME m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd); #endif //_SCB_REPLACE_MINIFRAME
These classes are intended to be used as base classes. Do not simply add your
code to the files - instead create a new class derived from
CSizingControlBarG
or CSizingControlBarCF
and put
there what you need. If you want to customize your gripper, or simply don't want
a gripper, you can use CSizingControlBar
as a base class.
Window IDs: The usage of IDs in the range of
AFX_IDW_CONTROLBAR_FIRST + 32 ..
AFX_IDW_CONTROLBAR_LAST
is required only if the bar will not be enabled
for docking (that's is - it will stay fixed right under the frame's menu). But
in this situation you won't be able to fully use the features of this class, so
if you will enable it to dock (a reasonable guess :) then you can use any valid
window ID.
Another place where the IDs are important is the saving/loading of
the bar's state. You must use different IDs for each control bar that is enabled
to dock, and this includes the other bars too. For example, if you have two
toolbars, you can create the first one with the default ID (which is
AFX_IDW_TOOLBAR = AFX_IDW_CONTROLBAR_FIRST
), but the second one
must have a different ID.
OnUpdateCmdUI: This member function is pure virtual in
CControlBar
(the base class of CSizingControlBar
). Its
purpose is to allow updating of controls at idle time (from here
CCmdUI::DoUpdate()
is called for the toolbars buttons, controls on
dialog bars, panes of status bar, etc.).
However, I found it very useful to
update the look of the "x" flat button in CSizingControlBarG
and
the color of the caption in CSizingControlBarCF
(no timers needed).
So, if you will use this function, don't forget to call the base class' member
(see mybar.cpp
).
Dynamic resizing: This feature allows redrawing of the bar during
resizing. Also all the bars are repositioned and redrawn if necessary.
The
SPI_GETDRAGFULLWINDOWS
system parameter is queried for this (it is
enabled by the "Show window contents while dragging" checkbox in Display
Properties).
CBRS_SIZE_DYNAMIC: This bar style is required. Make sure you add it to
the bar, otherwise the application will crash when the user floats a bar. You
can add it using SetBarStyle()
after Create()
, or by
changing the default style for Create()
to something like:
WS_VISIBLE|WS_CHILD|CBRS_TOP|CBRS_SIZE_DYNAMIC
.
State persistence: The common MFC control bars' docking state is saved
using CMainFrame::SaveBarState()
. In addition to the info saved by
this function, the CSizingControlBar
class needs to save 3 sizes.
This is done in CSizingControlBar::SaveState()
function, so a
m_wndMyBar.SaveState()
call is required. Please note that the state
storing code must be placed in CMainFrame
's OnClose()
or DestroyWindow()
, not in OnDestroy()
, because at the
time the WM_DESTROY
message is received, the floating bars are
already destroyed.
In CMainFrame::OnCreate()
, the
m_wndMyBar.LoadState()
call must be placed before
LoadBarState()
.
Alternatively, if you have more than one
resizable bars, you can call once the static member
SizingControlBar::GlobalSaveState()
instead of calling each bar's
SaveState()
. The same for LoadState()
- there is a
CSizingControlBar::GlobalLoadState()
function. See both samples
here for more details.
Precompiler flags: There are 2 symbols which can be defined to cause the floating bars to have different appearance and functionality:
_SCB_REPLACE_MINIFRAME
can be used to plug in
CSCBMiniDockFrameWnd, which is a custom miniframe class. The main gain of
using this class is that the floating bars can be resized dynamically, like
all other windows. The other advantage is that the miniframe caption can be
turned off, allowing the bar to display its own gripper, for increased
functionality and/or custom designs. m_pFloatingFrameClass
member of the main frame (see
the advanced example above).
_SCB_MINIFRAME_CAPTION
can be defined only if the previous
flag is also defined. It causes the custom miniframe to keep the tool window
caption. CSizingControlBarG
and
CSizingControlBarCF
classes do not display a gripper when
floating if this flag is set. See also http://www.datamekanix.com/ for class reference, a full changelog, FAQ, a dedicated message board and more.
Click here to view Cristi Posea's online profile. |
![]() |
156 comments have been posted for this article. Visit http://www.codeproject.com/docking/sizecbar.asp to post and view comments on this article.
All Topics, MFC / C++ >> Toolbars / Docking Windows
>> Docking
Windows Updated: 16 Aug 2000 |
Article content
copyright Cristi Posea, 1999 everything else Copyright © CodeProject, 1999-2004. |