- The Traditional
Way
- If you are a hardcore VC++
developer, you must have noticed that adding splitter support to
VC++/MFC apps has some serious limitations and also the plumbing job
isn't that simple and straightforward. On the limitation side, you
can only add splitters to MDI child windows and not all other form
of windows, such as dialogs or even plain vanilla windows. Also, the
splitter pane windows must be derived from CView class, they can not
be controls such as a listbox or an editbox. Adding the support also
isn't very simple either.. you need to override some functions in
the MDIChild window class and write some code to do that.
-
- The RAD way
- RadVC's splitter support does not
have any of these limitations you normally face in traditional VC++
apps. First, when you use RadVC, you can add splitters to just any
kind of windows, not only to MDI child windows. Also splitter pane
windows can be any kind of controls, they do not need to be
contained inside CView derived view windows. What is more amazing,
RadVC does not require you to write a single line of code to do all
these complex stuff. RadVC's drag-n-drop programming technique will
take care of these tough plumbing job for you.
-
- What You Need
- VC++ 6.0 with
RadVC 1.2
-
- CoolPix - An App
with Splitter Window
- To demonstrate how easy and flexible
it is to have splitter windows inside your C++ apps, we will build a
test application called CoolPix. CoolPix has only one form, which is
"sliced" vertically into two panes. The left pane is a
list box control, listing some of the cool pictures of your
collection. The right hand pane is a CWnd-derived RAD C++ control,
called "CRightPane". When you
click on a picture item in the left-hand side listbox control, the
picture gets displayed in the right-hand side pane. We could have
used a picturebox control in place of the CRightPane control, but we
have got some interesting ideas to implement inside this control.
We'll get to this in more detail when we will enhance our CoolPix
app in the later part of the article.
Here is how we build the app
(1) Using RadVC, create an
application with name "CoolPix". RadVC brings up the startup
form in its client area. Change the caption property of the form to
CoolPix.
(2) Insert the RAD C++
control CRSplitter into RadVC toolbox. If you don't know how to insert a
RAD C++ control,
please visit this page to learn more. It's as easy as 1-2-3.
(3) Create a skeleton RAD
C++ control called "CRightPane".
(4) Drop a listbox control
and a "CRightPane" control in the "CForm1" form. These controls will act as panes in
our form. You do not need to set the position and size properties (Left,
Top, Width and Height properties) of these controls. The splitter control will take care
of everything.
(5) Drop the CRSplitter
control in the form. Like the two "pane" controls you inserted
earlier, you do not need to set their position and size properties.
After you have added these
controls in design mode, your form will look something like this:
The CRSplitter control
is the heart of our "splitter" form. So let's first examine the
properties it supports.
Property |
Description |
SplitVertical |
Defines
whether the splitter will split the form vertically or horizontally
(Boolean) |
SplitterSize |
Size
of the control (sizing bar). When SplitVertical property is set to
TRUE, it is the width of the splitter bar. Likewise, when SplitVertical
is set to FALSE, it is the height of the splitter bar. [Default
value is 4] (short) |
BackColor |
Background
color of the splitter. (COLORREF) |
Pane1SizePerc |
Size
of the first pane as a percentage of the total form size. For
example, when SplitVertical property is set to TRUE and this value
is 20, then the left pane will occupy 20% of the total form width.
[Default value is 30]. (short) |
Pane1Size |
Fixed
size of pane1 in pixel. When this property has a positive value, the
first pane always appear with a fixed size and hence is not
proportionally resized. When this value is set to a negative number,
the panes are proportionally resized according to the
"Pane1SizePerc" property.
[Default value is -1]. (short) |
InvertPaneOrder |
Toggles
the order in which the panes appear on the form. (Boolean) |
DrawBevel |
Determines
whether to draw a bevel around the splitter bar. (Boolean). |
AutoResize |
Determines
whether the control should automatically resize the panes as the
form gets resized. (Boolean). When this value is set to TRUE
(default value), the splitter control periodically checks the
size of the parent window( typically a form) and makes sure that the
panes are resized according to "Pane1Size" or "Pane1SizePerc"
properties. When a more responsive resizing operation is intended,
this value should be set to FALSE. However, in this case the user
should override the "Resize" event of the form (or generic
WM_SIZE event), and call "Resize()" method of the splitter
control from the event handler. |
As you can probably think,
the set of properties CRSplitter control supports, give you a lot of maneuvering
power with the splitter support in a form. For our CoolPix sample, there
is no need to make any change in the default set of properties, however
you are free to play with the properties to find out how things really
work.
Before we go further, let's
have a trivia game. Here
is the question: "How do you hide the splitter bar so that the panes
can not be resized?" [Remember
we don't have any property like "HideBar" or "EnableResizing"]. You'll know
the answer as we finish the article.
We won't be going too much
into the "under-the-hood" stuff, like how to display the picture
on the right pane as we click on a listbox item on the left pane. The code
is very straightforward and can be downloaded from here.
Now load the
"CoolPix" project in DevStudio and compile it. When you run it,
our CoolPix will appear in its full glory like this:
CoolPixEx - An
Enhanced CoolPix App
CoolPixEx enhances our
original CoolPix app by adding a horizontal splitter in the
right hand side pane. The selected picture is now shown in the new
right-top pane. The newly added right-bottom pane now shows a
textbox enabling users to add some note on the displayed picture.
You have probably seen this kind of state-of-the-art user interfaces
in applications like Microsoft Outlook.
To do this we need to create another
CWnd-derived control called CRightTopPane. Next, open the CRightPane
control window by clicking on the "CRightPane" treeitem in
the form list (in RadVC's project window). Now, we need to add our
controls in the right pane window. This is very similar what we did
while designing the main form. As you can probably expect, we need
to add one CRightTopPane control, one CRSplitter control and a
textbox control. Since we want our panes to be horizontally split,
so we need to set the "SplitVertical" property to FALSE.
Once we finish the design, the CRightPane will look something like
this:
The code for the "CoolPixEx"
isn't very different from our original "CoolPix" app. As
you can probably guess, CRightTopPane is the control that now
displays the picture, so we need to move the drawing code [in ::DrawControl()
function] from CRightPane class to CRightTopPane class. You will
find the rest of the code very easy to follow. Now, download
CoolPixEx code from here,
build and then run. Here is what it will look like.
Answer to Trivia
Question:
Question: How do you hide the
splitter bar so that the panes can not be resized?
Answer: Set the "SplitterSize"
property to zero.
Did you find this article useful? If so,
please let us know. Also we
need your ideas on new articles / tech tips etc.
|