Click here to Skip to main content
Click here to Skip to main content

ZSplitter : adding automatic splitting for dialog controls

By , 28 May 2001
Rate this:
Please Sign up or sign in to vote.

Introduction

The ZSplitterDlg and ZSplitter classes help you to add splitters to your dialog, property sheet or any other window. It splits your controls and makes them movable and resizeable. I think this way is better than "auto size" contol: it adds a "docking" opportunity. Moreover, one more control added that add "auto size" option. Finally, you can integrate the ZSplitterDlg with a resizable dialog (for example CResizableDialog by Paolo Messina).

Note that you shouldn't add anything to your resources and shouldn't describe the relations between controls. Just make the corresponding size and position of your controls and use the functions:

void addControls(int count, bool connectVertical, ...);
void addControl(int id);

Demo project shows using these automatically added controls in CDialog, CPropertyPage, CView and CFormView classes.

Sample Image

Using the class

The simplest way is to use the ZSplitterDlgImpl template. You should change:

  • The parent of your dialog ot view class,
  • the constructor implementation,
  • the second parameter in BEGIN_MESSAGE_MAP macros, and
  • the "on init" function of your window.
// in header
class CTestDlg1 : public ZSplitterDlgImpl<CPropertyPage>

// in source
CTestDlg1::CTestDlg1() : /*...*/ ZSplitterDlgImpl<CPropertyPage>(CTestDlg1::IDD) {}

BEGIN_MESSAGE_MAP(CTestDlg1, ZSplitterDlgImpl<CPropertyPage>)
	//	...
END_MESSAGE_MAP()

BOOL CTestDlg1::OnInitDialog() 
{
	// ... and use addControl(s) function here
	init();
	// ...
}

The ZSplitterDlgImpl template has a second parameter (ZSplitter2 by default). ZSplitter2 is the implementation of a spliter control. It has a virtual function OnPaint() - and you can change it's realisation to have different view of your control (see CMyView1 class in demo project).

The ZSplitterDlgImpl template helps you to implement splitter controls but you can use its base ZSplitterDlg class (look for CTestDlg2 class) in demo project.

I remade a little CResizableDialog with the permission of the author and you can use it with my splitters: use the ZSplitterDlgResizable class for this job. (look for CDemoDlg class) in the demo project.

resizable sample

This is a sample of your dialog in resource editor:

in vc++ editor

And user can change it in such way in runtime.

after user manipulations

You should use the addControls or addControl functions to add one control to the "splitter set" or a group of controls: they will move together. This is an example which you seen above

  addControls(2,false,IDC_LIST6,IDC_LIST7);
  addControls(2,true,IDC_LIST1,IDC_LIST8);
  addControl(IDC_LIST9);
  addControl(IDC_LIST2);
  addControl(IDC_LIST3);
  addControl(IDC_LIST4);
  addControl(IDC_LIST5);

Moreover you can manually add a ZSplitter class (the most common splitter controls) to a page. Look at the images and in the CTestDlg3 class of the demo project for details.

before moving after moving

To Do list

I'd like to make the look (color, size, effects) of the splitter more presentable. So I want to get comments from you. First of all: is this technique useful to you?

Note

Make sure to check out the my web site which is more likely to have updates and betas:
http://www.zmike.net

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Mike Melnikov
Web Developer
Russian Federation Russian Federation
Mike has been programming in C/C++ for 11 years and Visual C++/MFC for 4 years. His background includes pure and applied mathematics, engineering and physics, and he is currently based in Moscow, Russia.

Comments and Discussions

 
QuestionThe compiler through not ah mistake too much Pinmember37240589826-Aug-12 1:11 
Questionthe demo can't compile under VS2008 Pinmemberpj220_200620-May-12 19:23 
GeneralMy vote of 5 Pinmemberzhangyongf27-Dec-10 16:31 
GeneralMyView1.obj : error LNK2001: unresolved external symbol "protected: static struct AFX_MSGMAP const CView::messageMap" PinmemberGertzog26-Nov-07 14:54 
Generalcompiling problems in 2003 .NET Pinmemberpicazo7-Aug-05 14:39 
GeneralRe: compiling problems in 2003 .NET Pinmembergnovice10-Oct-05 18:47 
Hello Genaro
 
I wanted an answer to the same problem (compile problem):
Found a related solution on:
http://www.codeguru.com/Cpp/Cpp/cpp_mfc/templates/comments.php/c4099/?thread=2597[^]
 
Note that the documented solution has a small error in it: word "template" needs to be replaced with "theTemplArgs"
 
See updated text below
 
#ifdef _AFXDLL
#define BEGIN_T_MESSAGE_MAP(theTemplArgs, theClass, baseClass) \
theTemplArgs \
const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \
{ return &theClass::messageMap; } \
theTemplArgs \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
theTemplArgs \
AFX_COMDAT const AFX_MSGMAP theClass::messageMap = \
{ &baseClass::GetThisMessageMap, &theClass::_messageEntries[0] }; \
theTemplArgs \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \
 
#else
#define BEGIN_T_MESSAGE_MAP(theTemplArgs, theClass, baseClass) \
theTemplArgs \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
theTemplArgs \
AFX_COMDAT const AFX_MSGMAP theClass::messageMap = \
{ &baseClass::messageMap, &theClass::_messageEntries[0] }; \
theTemplArgs \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \
 
#endif
 
Regards,
 
GN
GeneralRe: compiling problems in 2003 .NET Pinmemberpicazo11-Oct-05 4:23 
QuestionCan not compile under VC7 PinmemberSatervalley13-Aug-02 17:12 
AnswerRe: Can not compile under VC7 Pinmemberchend30-Oct-02 22:19 
GeneralFit a dialog in a View of a Window PinmemberAnonymous17-Apr-02 9:16 
GeneralRe: Fit a dialog in a View of a Window PinmemberCapsuleDweller9-May-02 1:44 
GeneralZSplit in dynamic dialog PinmemberEmanuele17-Apr-02 8:18 
GeneralRe: ZSplit in dynamic dialog PinmemberMike Melnikov24-Jul-02 1:50 
Generalpragma warning PinmemberJean-Louis Guenego6-Aug-01 0:37 
GeneralSplitter PinmemberPascal Cayrol18-May-01 3:00 
GeneralRe: Splitter PinmemberPascal Cayrol18-May-01 4:14 
GeneralRe: Splitter PinmemberMike Melnikov30-May-01 1:27 
GeneralNow it works with resizable dialog. PinmemberMike Melnikov6-Mar-01 23:17 
Questionwork with resizable dialog? Pinmemberphilip andrew1-Mar-01 13:04 
AnswerRe: work with resizable dialog? PinmemberMike Melnikov2-Mar-01 5:48 
AnswerRe: work with resizable dialog? PinmemberMike Melnikov6-Mar-01 23:25 
GeneralRe: work with resizable dialog? Pinmemberphilip andrew13-Mar-01 10:46 
GeneralExample As Member tab crashes PinmemberAnonymous26-Feb-01 1:49 
GeneralRe: Example As Member tab crashes PinmemberMike Melnikov26-Feb-01 5:33 
GeneralI got the same problem. PinmemberAnonymous26-Feb-01 13:13 
GeneralRe: I got the same problem. PinmemberAnonymous26-Feb-01 22:51 
GeneralRe: I got the same problem. PinmemberMike Melnikov27-Feb-01 0:20 
GeneralCrashes fixed PinmemberMike Melnikov27-Feb-01 0:01 
Generalto Mike Melnikov PinmemberAnonymous27-Feb-01 17:16 
Generalcan not compile under VC7 Pinmemberchend30-Oct-02 22:05 
GeneralRe: can not compile under VC7 Pinmembersdingle20-May-09 14:31 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web02 | 2.8.140415.2 | Last Updated 29 May 2001
Article Copyright 2001 by Mike Melnikov
Everything else Copyright © CodeProject, 1999-2014
Terms of Use
Layout: fixed | fluid