1 /////////////////////////////////////////////////////////////////////////////
3 // This file is part of ResizableLib
4 // http://sourceforge.net/projects/resizablelib
6 // Copyright (C) 2000-2004 by Paolo Messina
7 // http://www.geocities.com/ppescher - mailto:ppescher@hotmail.com
9 // The contents of this file are subject to the Artistic License (the "License").
10 // You may not use this file except in compliance with the License.
11 // You may obtain a copy of the License at:
12 // http://www.opensource.org/licenses/artistic-license.html
14 // If you find this code useful, credits would be nice!
16 /////////////////////////////////////////////////////////////////////////////
20 * @brief Implementation of the CResizableMinMax class.
24 #include "ResizableMinMax.h"
28 static char THIS_FILE
[]=__FILE__
;
32 //////////////////////////////////////////////////////////////////////
33 // Construction/Destruction
34 //////////////////////////////////////////////////////////////////////
36 CResizableMinMax::CResizableMinMax()
40 CResizableMinMax::~CResizableMinMax()
44 void CResizableMinMax::MinMaxInfo(LPMINMAXINFO lpMMI
)
47 lpMMI
->ptMinTrackSize
= m_ptMinTrackSize
;
50 lpMMI
->ptMaxTrackSize
= m_ptMaxTrackSize
;
54 lpMMI
->ptMaxPosition
= m_ptMaxPos
;
55 lpMMI
->ptMaxSize
= m_ptMaxSize
;
59 void CResizableMinMax::ChainMinMaxInfo(LPMINMAXINFO lpMMI
, CWnd
* pParentFrame
, CWnd
* pWnd
)
61 // get the extra size from child to parent
62 CRect rectClient
, rectWnd
;
63 if ((pParentFrame
->GetStyle() & WS_CHILD
) && pParentFrame
->IsZoomed())
64 pParentFrame
->GetClientRect(rectWnd
);
66 pParentFrame
->GetWindowRect(rectWnd
);
67 pParentFrame
->RepositionBars(0, 0xFFFF,
68 AFX_IDW_PANE_FIRST
, CWnd::reposQuery
, rectClient
);
69 CSize sizeExtra
= rectWnd
.Size() - rectClient
.Size();
71 ChainMinMaxInfo(lpMMI
, pWnd
->GetSafeHwnd(), sizeExtra
);
74 void CResizableMinMax::ChainMinMaxInfo(LPMINMAXINFO lpMMI
, HWND hWndChild
, CSize sizeExtra
)
76 // ask the child window for track size
77 MINMAXINFO mmiChild
= *lpMMI
;
78 ::SendMessage(hWndChild
, WM_GETMINMAXINFO
, 0, (LPARAM
)&mmiChild
);
79 BOOL bRetMax
= (lpMMI
->ptMaxTrackSize
.x
!= mmiChild
.ptMaxTrackSize
.x
80 || lpMMI
->ptMaxTrackSize
.y
!= mmiChild
.ptMaxTrackSize
.y
);
81 BOOL bRetMin
= (lpMMI
->ptMinTrackSize
.x
!= mmiChild
.ptMinTrackSize
.x
82 || lpMMI
->ptMinTrackSize
.y
!= mmiChild
.ptMinTrackSize
.y
);
84 // add static extra size
85 mmiChild
.ptMaxTrackSize
= sizeExtra
+ mmiChild
.ptMaxTrackSize
;
86 mmiChild
.ptMinTrackSize
= sizeExtra
+ mmiChild
.ptMinTrackSize
;
88 // min size is the largest
91 lpMMI
->ptMinTrackSize
.x
= __max(lpMMI
->ptMinTrackSize
.x
,
92 mmiChild
.ptMinTrackSize
.x
);
93 lpMMI
->ptMinTrackSize
.y
= __max(lpMMI
->ptMinTrackSize
.y
,
94 mmiChild
.ptMinTrackSize
.y
);
96 // max size is the shortest
99 lpMMI
->ptMaxTrackSize
.x
= __min(lpMMI
->ptMaxTrackSize
.x
,
100 mmiChild
.ptMaxTrackSize
.x
);
101 lpMMI
->ptMaxTrackSize
.y
= __min(lpMMI
->ptMaxTrackSize
.y
,
102 mmiChild
.ptMaxTrackSize
.y
);
106 BOOL
CResizableMinMax::CalcSizeExtra(HWND
/*hWndChild*/, CSize
/*sizeChild*/, CSize
& /*sizeExtra*/)
108 // should be overridden if you use ChainMinMaxInfoCB
113 void CResizableMinMax::ChainMinMaxInfoCB(LPMINMAXINFO lpMMI
, HWND hWndChild
)
115 // ask the child window for track size
116 MINMAXINFO mmiChild
= *lpMMI
;
117 ::SendMessage(hWndChild
, WM_GETMINMAXINFO
, 0, (LPARAM
)&mmiChild
);
118 BOOL bRetMax
= (lpMMI
->ptMaxTrackSize
.x
!= mmiChild
.ptMaxTrackSize
.x
119 || lpMMI
->ptMaxTrackSize
.y
!= mmiChild
.ptMaxTrackSize
.y
);
120 BOOL bRetMin
= (lpMMI
->ptMinTrackSize
.x
!= mmiChild
.ptMinTrackSize
.x
121 || lpMMI
->ptMinTrackSize
.y
!= mmiChild
.ptMinTrackSize
.y
);
123 // use a callback to determine extra size
124 CSize
sizeExtra(0, 0);
125 bRetMax
= bRetMax
&& CalcSizeExtra(hWndChild
, mmiChild
.ptMaxTrackSize
, sizeExtra
);
126 mmiChild
.ptMaxTrackSize
= sizeExtra
+ mmiChild
.ptMaxTrackSize
;
127 bRetMin
= bRetMin
&& CalcSizeExtra(hWndChild
, mmiChild
.ptMinTrackSize
, sizeExtra
);
128 mmiChild
.ptMinTrackSize
= sizeExtra
+ mmiChild
.ptMinTrackSize
;
130 // min size is the largest
133 lpMMI
->ptMinTrackSize
.x
= __max(lpMMI
->ptMinTrackSize
.x
,
134 mmiChild
.ptMinTrackSize
.x
);
135 lpMMI
->ptMinTrackSize
.y
= __max(lpMMI
->ptMinTrackSize
.y
,
136 mmiChild
.ptMinTrackSize
.y
);
138 // max size is the shortest
141 lpMMI
->ptMaxTrackSize
.x
= __min(lpMMI
->ptMaxTrackSize
.x
,
142 mmiChild
.ptMaxTrackSize
.x
);
143 lpMMI
->ptMaxTrackSize
.y
= __min(lpMMI
->ptMaxTrackSize
.y
,
144 mmiChild
.ptMaxTrackSize
.y
);
148 void CResizableMinMax::SetMaximizedRect(const CRect
& rc
)
150 m_bUseMaxRect
= TRUE
;
152 m_ptMaxPos
= rc
.TopLeft();
153 m_ptMaxSize
.x
= rc
.Width();
154 m_ptMaxSize
.y
= rc
.Height();
157 void CResizableMinMax::ResetMaximizedRect()
159 m_bUseMaxRect
= FALSE
;
162 void CResizableMinMax::SetMinTrackSize(const CSize
& size
)
164 m_bUseMinTrack
= TRUE
;
166 m_ptMinTrackSize
.x
= size
.cx
;
167 m_ptMinTrackSize
.y
= size
.cy
;
170 void CResizableMinMax::ResetMinTrackSize()
172 m_bUseMinTrack
= FALSE
;
175 void CResizableMinMax::SetMaxTrackSize(const CSize
& size
)
177 m_bUseMaxTrack
= TRUE
;
179 m_ptMaxTrackSize
.x
= size
.cx
;
180 m_ptMaxTrackSize
.y
= size
.cy
;
183 void CResizableMinMax::ResetMaxTrackSize()
185 m_bUseMaxTrack
= FALSE
;