![]() |
Desktop Development »
Splitter Windows »
General
Intermediate
Another splitter control for dialogBy Hung NguyenA very simple splitter control for dialogs |
VC6Win2K, WinXP, MFC, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
I'm a student and very interested in VC++. I often enter this web site to get free source code. I was in need of a splitter in a dialog. I downloaded one but it's very complex and I felt it was difficult to use the control (although it's very powerful) so I made one for myself. Maybe, it's not useful for you, but if there's only one person who thinks it's useful, I will be very happy. Sometimes you don't need good skill, just a good idea, and by this simple way a useful piece of code will be produced. My splitter control is one of this kind.
First of all, add two files SplitterControl.h and SplitterControl.cpp to the project. Remember to add #include "splittercontrol.h" to the header file of the class which uses it.
Add member varible to the dialog class
protected:
CSplitterControl m_wndSplitter1;
Now, we create the control by calling it's create function. This code would
appear in the OnInitDialog or OnCreate function.
BOOL CSPDemoDlg::OnInitDialog()
{
...
pWnd = GetDlgItem(IDC_SPLITTER1);
pWnd->GetWindowRect(rc);
ScreenToClient(rc);
m_wndSplitter1.Create(WS_CHILD | WS_VISIBLE, rc, this, IDC_SPLITTER1);
m_wndSplitter1.SetRange(50, 50, -1);
...
There is a tip here. Instead of calculating the rect for the splitter, we add
a static control on the dialog (by resource editor), give it an ID (IDC_SPLITTER1)
and make it invisible. Size it and locate in the resource editor, and then call
the function GetWindowRect(rc) to move the m_wndSplitter1 to the rect.
And here is the code for resizing controls on the dialog when the user moves the splitter control.
// // LRESULT CSPDemoDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_NOTIFY) { if (wParam == IDC_SPLITTER1) { SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam; DoResize1(pHdr->delta); } } return CDialog::DefWindowProc(message, wParam, lParam); } // void CSPDemoDlg::DoResize1(int delta) { // Change the width for m_wndType, m_lstItem, m_txtContent CSplitterControl::ChangeWidth(&m_wndType, delta); CSplitterControl::ChangeWidth(&m_lstItem, -delta, CW_RIGHTALIGN); CSplitterControl::ChangeWidth(&m_txtContent, -delta, CW_RIGHTALIGN); Invalidate(); UpdateWindow(); }
CSplitterControl
class CSplitterControl : public CStatic { // Construction public: CSplitterControl(); // Attributes protected: BOOL m_bIsPressed; int m_nType; int m_nX, m_nY; int m_nMin, m_nMax; int m_nSavePos; // Save point on the lbutton down public: // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CSplitterControl) //}}AFX_VIRTUAL // Implementation public: static void ChangePos(CWnd* pWnd, int dx, int dy); static void ChangeWidth(CWnd* pWnd, int dx, DWORD dwFlag = CW_LEFTALIGN); static void ChangeHeight(CWnd* pWnd, int dy, DWORD dwFlag = CW_TOPALIGN); public: void SetRange(int nMin, int nMax); void SetRange(int nSubtraction, int nAddition, int nRoot); int GetStyle(); int SetStyle(int nStyle = SPS_VERTICAL); void Create(DWORD dwStyle, const CRect& rect, CWnd* pParent, UINT nID); virtual ~CSplitterControl(); // Generated message map functions protected: virtual void DrawLine(CDC* pDC, int x, int y); void MoveWindowTo(CPoint pt); //{{AFX_MSG(CSplitterControl) afx_msg void OnPaint(); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; // this struct is sent as lparam in WM_NOTIFY message typedef struct SPC_NMHDR { NMHDR hdr; int delta; // delta : the different position of the splitter before and // after being moved. } SPC_NMHDR;
Well, that's all about my code. Maybe, the explanation is not very clear, but
I hope you'll find it easy to use. No special skill, you see. Very simple. Thanks
for reading my article. Please give your ideas as to whether you like or hate it.
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 12 Jul 2002 Editor: Chris Maunder |
Copyright 2002 by Hung Nguyen Everything else Copyright © CodeProject, 1999-2009 Web22 | Advertise on the Code Project |