Introduction
This is my first time posting an article in CodeProject. CodeProject has been very helpful to me. I want to give back the help given by the authors by submitting my own article.
In MFC, CSplitterWnd
is usually available MDI or SDI. I just think splitter controls are just dragable buttons. So I decided to implement a class named CControlSplitter
derived from CButton
to work like CSplitterWnd
for dialog based MFC applications.
Background
The implementation is very simple. As long as you know how to subclass MFC controls, you can understand how this works and improve it.
Using the code
In your project, include the following files:
- ControlSplitter.h
- ControlSplitter.cpp
Include ControlSplitter.h in your dialog header:
#include "ControlSplitter.h"
Add splitter buttons in your dialog using the usual button control which will serve as the splitter and set its control ID such as IDC_SPLITTER1
.
Using the MFC Class Wizard, add control member variables in your dialog for the added splitter buttons with type CControlSplitter
.
After adding member control variables, the following must be implemented:
- Declaration of the control splitter in your dialog header:
...
CControlSplitter m_splitter;
...
- Sub class the control using
DDX_Control
in the DoDataExchange
of your dialog.
void CSplitterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
...
DDX_Control(pDX, IDC_SPLITTER, m_splitter);
...
}
Setup your splitter in the OnInitDialog() method of your dialog
- [Required] Set the type of the control splitter:
m_splitter.SetType(CControlSplitter::CS_VERT);
The available types are CS_NONE
(default), CS_VERT
, and CS_HORZ
.
public:
typedef enum {
CS_VERT = 1,
CS_HORZ = 2,
CS_NONE = 0
};
- Add sibling controls to the splitter's control listing.
Control splitters have two control listings:
- Top control listing (for
CS_VERT
type) or left control listing (for CS_HORZ
type) - Bottom control listing (for
CS_VERT
type) or right control listing (for CS_HORZ
type)
To add the control's top control listing or left control listing, use the AddToTopOrLeftCtrls
method.
m_splitter.AddToTopOrLeftCtrls(IDOK);
To add the control's bottom control listing or right control listing, use the AddToBottomOrRightCtrls
method.
m_splitter.AddToBottomOrRightCtrls(IDC_EDIT1);
Here is the declaration for AddToTopOrLeftCtrls
and AddToBottomOrRightCtrls
:
void AddToBottomOrRightCtrls(UINT nCtrlId, WORD nFlags =
SPF_TOP|SPF_LEFT|SPF_RIGHT|SPF_BOTTOM);
void AddToTopOrLeftCtrls(UINT nCtrlId, WORD nFlags =
SPF_TOP|SPF_LEFT|SPF_BOTTOM|SPF_RIGHT);
[Note:] The two methods have extra flag parameters that can be used to specify the behaviour of the sibling controls when the control splitter is being dragged. Possible values could be the combination of the following:
#define SPF_TOP 0x0010
#define SPF_BOTTOM 0x0020
#define SPF_LEFT 0x0040
#define SPF_RIGHT 0x0080
Class working methods
CControlSplitter();
This is the contstructor.
void SetType(UINT nType);
This sets the type of the control splitter in either CS_VERT
or CS_HORZ
.
void AddToTopOrLeftCtrls(UINT nCtrlId, WORD nFlags);
This is used to add the control to the top or the left control listing.
void AddToBottomOrRightCtrls(UINT nCtrlId, WORD nFlags);
This is used to add the control to the bottom or the right control listing.
void OnLButtonDown(UINT nFlags, CPoint point);
This is fired when the user presses down the left button of the mouse over the control.
void OnLButtonUp(UINT nFlags, CPoint point);
This is fired when the user releases up the left button of the mouse over the control.
void OnMouseMove(UINT nFlags, CPoint point);
This is fired when the user moves the mouse over the control.
void OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
This is fired when the system asks for the cursor. The cursor is settled using SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)m_hCursor);
.
Class working member variables
unsigned int m_nType;
std::vector<DWORD> m_vtTopLeftControls;
std::vector<DWORD> m_vtBottomRightControls;
CPoint m_ptStartDrag,m_ptStartPos;
bool m_bDragging;
HCURSOR m_hCursor;
CRect m_rectMax;
CWnd * m_pOldDragCapture;
History
- 15 Jul 2011: First release.
- 25 Jul 2011: Translated Readme.txt in the demo download.
Focused in Leading Business Development while working as a Software Developer. His specialty is C++ and PHP. Been developing MS Windows application since 2007.