1 // ResizableSplitterWnd.cpp : implementation file
3 /////////////////////////////////////////////////////////////////////////////
5 // This file is part of ResizableLib
6 // http://sourceforge.net/projects/resizablelib
8 // Copyright (C) 2000-2004 by Paolo Messina
9 // http://www.geocities.com/ppescher - mailto:ppescher@hotmail.com
11 // The contents of this file are subject to the Artistic License (the "License").
12 // You may not use this file except in compliance with the License.
13 // You may obtain a copy of the License at:
14 // http://www.opensource.org/licenses/artistic-license.html
16 // If you find this code useful, credits would be nice!
18 /////////////////////////////////////////////////////////////////////////////
21 #include "ResizableSplitterWnd.h"
26 static char THIS_FILE
[] = __FILE__
;
29 /////////////////////////////////////////////////////////////////////////////
30 // CResizableSplitterWnd
32 IMPLEMENT_DYNAMIC(CResizableSplitterWnd
, CSplitterWnd
)
34 CResizableSplitterWnd::CResizableSplitterWnd()
38 CResizableSplitterWnd::~CResizableSplitterWnd()
42 BEGIN_MESSAGE_MAP(CResizableSplitterWnd
, CSplitterWnd
)
43 //{{AFX_MSG_MAP(CResizableSplitterWnd)
48 /////////////////////////////////////////////////////////////////////////////
49 // CResizableSplitterWnd message handlers
51 void CResizableSplitterWnd::OnGetMinMaxInfo(MINMAXINFO FAR
* lpMMI
)
53 if ((GetStyle() & SPLS_DYNAMIC_SPLIT
) &&
54 GetRowCount() == 1 && GetColumnCount() == 1)
56 CWnd
* pPane
= GetActivePane();
59 // get the extra size from child to parent
60 CRect rectClient
, rectWnd
;
61 GetWindowRect(rectWnd
);
62 pPane
->GetWindowRect(rectClient
);
63 CSize sizeExtra
= rectWnd
.Size() - rectClient
.Size();
65 ChainMinMaxInfo(lpMMI
, pPane
->m_hWnd
, sizeExtra
);
68 else if (!(GetStyle() & SPLS_DYNAMIC_SPLIT
))
70 ASSERT(m_nCols
> 0 && m_nRows
> 0);
72 CSize
sizeMin(0,0), sizeMax(0,0);
73 for (int col
= 0; col
< m_nCols
; ++col
)
75 // calc min and max width for each column
78 for (int row
= 0; row
< m_nRows
; ++row
)
80 CWnd
* pWnd
= GetPane(row
, col
);
81 // ask the child window for track size
82 MINMAXINFO mmiChild
= *lpMMI
;
83 mmiChild
.ptMinTrackSize
.x
= 0;
84 mmiChild
.ptMaxTrackSize
.x
= LONG_MAX
;
85 ::SendMessage(pWnd
->GetSafeHwnd(), WM_GETMINMAXINFO
, 0, (LPARAM
)&mmiChild
);
86 max
= __min(max
, mmiChild
.ptMaxTrackSize
.x
);
87 min
= __max(min
, mmiChild
.ptMinTrackSize
.x
);
89 // sum all column widths
90 if (sizeMax
.cx
== LONG_MAX
|| max
== LONG_MAX
)
91 sizeMax
.cx
= LONG_MAX
;
93 sizeMax
.cx
+= max
+ m_cxSplitterGap
;
94 sizeMin
.cx
+= min
+ m_cxSplitterGap
;
96 for (int row
= 0; row
< m_nRows
; ++row
)
98 // calc min and max height for each row
101 for (int col
= 0; col
< m_nCols
; ++col
)
103 CWnd
* pWnd
= GetPane(row
, col
);
104 // ask the child window for track size
105 MINMAXINFO mmiChild
= *lpMMI
;
106 mmiChild
.ptMinTrackSize
.y
= 0;
107 mmiChild
.ptMaxTrackSize
.y
= LONG_MAX
;
108 ::SendMessage(pWnd
->GetSafeHwnd(), WM_GETMINMAXINFO
, 0, (LPARAM
)&mmiChild
);
109 max
= __min(max
, mmiChild
.ptMaxTrackSize
.y
);
110 min
= __max(min
, mmiChild
.ptMinTrackSize
.y
);
112 // sum all row heights
113 if (sizeMax
.cy
== LONG_MAX
|| max
== LONG_MAX
)
114 sizeMax
.cy
= LONG_MAX
;
116 sizeMax
.cy
+= max
+ m_cySplitterGap
;
117 sizeMin
.cy
+= min
+ m_cySplitterGap
;
119 // adjust total size: add the client border and
120 // we counted one splitter more than necessary
121 sizeMax
.cx
+= 2*m_cxBorder
- m_cxSplitterGap
;
122 sizeMax
.cy
+= 2*m_cyBorder
- m_cySplitterGap
;
123 sizeMin
.cx
+= 2*m_cxBorder
- m_cxSplitterGap
;
124 sizeMin
.cy
+= 2*m_cyBorder
- m_cySplitterGap
;
125 // add non-client size
126 CRect
rectExtra(0,0,0,0);
127 ::AdjustWindowRectEx(&rectExtra
, GetStyle(), !(GetStyle() & WS_CHILD
) &&
128 ::IsMenu(GetMenu()->GetSafeHmenu()), GetExStyle());
129 sizeMax
+= rectExtra
.Size();
130 sizeMin
+= rectExtra
.Size();
132 lpMMI
->ptMinTrackSize
.x
= __max(lpMMI
->ptMinTrackSize
.x
, sizeMin
.cx
);
133 lpMMI
->ptMinTrackSize
.y
= __max(lpMMI
->ptMinTrackSize
.y
, sizeMin
.cy
);
134 lpMMI
->ptMaxTrackSize
.x
= __min(lpMMI
->ptMaxTrackSize
.x
, sizeMax
.cx
);
135 lpMMI
->ptMaxTrackSize
.y
= __min(lpMMI
->ptMaxTrackSize
.y
, sizeMax
.cy
);