1 /////////////////////////////////////////////////////////////////////////////
\r
3 // This file is part of ResizableLib
\r
4 // http://sourceforge.net/projects/resizablelib
\r
6 // Copyright (C) 2000-2004 by Paolo Messina
\r
7 // http://www.geocities.com/ppescher - mailto:ppescher@hotmail.com
\r
9 // The contents of this file are subject to the Artistic License (the "License").
\r
10 // You may not use this file except in compliance with the License.
\r
11 // You may obtain a copy of the License at:
\r
12 // http://www.opensource.org/licenses/artistic-license.html
\r
14 // If you find this code useful, credits would be nice!
\r
16 /////////////////////////////////////////////////////////////////////////////
\r
20 * @brief Implementation of the CResizableMinMax class.
\r
24 #include "ResizableMinMax.h"
\r
28 static char THIS_FILE[]=__FILE__;
\r
29 #define new DEBUG_NEW
\r
32 //////////////////////////////////////////////////////////////////////
\r
33 // Construction/Destruction
\r
34 //////////////////////////////////////////////////////////////////////
\r
36 CResizableMinMax::CResizableMinMax()
\r
38 m_bUseMinTrack = FALSE;
\r
39 m_bUseMaxTrack = FALSE;
\r
40 m_bUseMaxRect = FALSE;
\r
43 CResizableMinMax::~CResizableMinMax()
\r
48 void CResizableMinMax::MinMaxInfo(LPMINMAXINFO lpMMI)
\r
51 lpMMI->ptMinTrackSize = m_ptMinTrackSize;
\r
54 lpMMI->ptMaxTrackSize = m_ptMaxTrackSize;
\r
58 lpMMI->ptMaxPosition = m_ptMaxPos;
\r
59 lpMMI->ptMaxSize = m_ptMaxSize;
\r
63 void CResizableMinMax::ChainMinMaxInfo(LPMINMAXINFO lpMMI, CWnd* pParentFrame, CWnd* pWnd)
\r
65 // get the extra size from child to parent
\r
66 CRect rectClient, rectWnd;
\r
67 if ((pParentFrame->GetStyle() & WS_CHILD) && pParentFrame->IsZoomed())
\r
68 pParentFrame->GetClientRect(rectWnd);
\r
70 pParentFrame->GetWindowRect(rectWnd);
\r
71 pParentFrame->RepositionBars(0, 0xFFFF,
\r
72 AFX_IDW_PANE_FIRST, CWnd::reposQuery, rectClient);
\r
73 CSize sizeExtra = rectWnd.Size() - rectClient.Size();
\r
75 ChainMinMaxInfo(lpMMI, pWnd->GetSafeHwnd(), sizeExtra);
\r
78 void CResizableMinMax::ChainMinMaxInfo(LPMINMAXINFO lpMMI, HWND hWndChild, CSize sizeExtra)
\r
80 // ask the child window for track size
\r
81 MINMAXINFO mmiChild = *lpMMI;
\r
82 ::SendMessage(hWndChild, WM_GETMINMAXINFO, 0, (LPARAM)&mmiChild);
\r
83 BOOL bRetMax = (lpMMI->ptMaxTrackSize.x != mmiChild.ptMaxTrackSize.x
\r
84 || lpMMI->ptMaxTrackSize.y != mmiChild.ptMaxTrackSize.y);
\r
85 BOOL bRetMin = (lpMMI->ptMinTrackSize.x != mmiChild.ptMinTrackSize.x
\r
86 || lpMMI->ptMinTrackSize.y != mmiChild.ptMinTrackSize.y);
\r
88 // add static extra size
\r
89 mmiChild.ptMaxTrackSize = sizeExtra + mmiChild.ptMaxTrackSize;
\r
90 mmiChild.ptMinTrackSize = sizeExtra + mmiChild.ptMinTrackSize;
\r
92 // min size is the largest
\r
95 lpMMI->ptMinTrackSize.x = __max(lpMMI->ptMinTrackSize.x,
\r
96 mmiChild.ptMinTrackSize.x);
\r
97 lpMMI->ptMinTrackSize.y = __max(lpMMI->ptMinTrackSize.y,
\r
98 mmiChild.ptMinTrackSize.y);
\r
100 // max size is the shortest
\r
103 lpMMI->ptMaxTrackSize.x = __min(lpMMI->ptMaxTrackSize.x,
\r
104 mmiChild.ptMaxTrackSize.x);
\r
105 lpMMI->ptMaxTrackSize.y = __min(lpMMI->ptMaxTrackSize.y,
\r
106 mmiChild.ptMaxTrackSize.y);
\r
110 BOOL CResizableMinMax::CalcSizeExtra(HWND /*hWndChild*/, CSize /*sizeChild*/, CSize& /*sizeExtra*/)
\r
112 // should be overridden if you use ChainMinMaxInfoCB
\r
117 void CResizableMinMax::ChainMinMaxInfoCB(LPMINMAXINFO lpMMI, HWND hWndChild)
\r
119 // ask the child window for track size
\r
120 MINMAXINFO mmiChild = *lpMMI;
\r
121 ::SendMessage(hWndChild, WM_GETMINMAXINFO, 0, (LPARAM)&mmiChild);
\r
122 BOOL bRetMax = (lpMMI->ptMaxTrackSize.x != mmiChild.ptMaxTrackSize.x
\r
123 || lpMMI->ptMaxTrackSize.y != mmiChild.ptMaxTrackSize.y);
\r
124 BOOL bRetMin = (lpMMI->ptMinTrackSize.x != mmiChild.ptMinTrackSize.x
\r
125 || lpMMI->ptMinTrackSize.y != mmiChild.ptMinTrackSize.y);
\r
127 // use a callback to determine extra size
\r
128 CSize sizeExtra(0, 0);
\r
129 bRetMax = bRetMax && CalcSizeExtra(hWndChild, mmiChild.ptMaxTrackSize, sizeExtra);
\r
130 mmiChild.ptMaxTrackSize = sizeExtra + mmiChild.ptMaxTrackSize;
\r
131 bRetMin = bRetMin && CalcSizeExtra(hWndChild, mmiChild.ptMinTrackSize, sizeExtra);
\r
132 mmiChild.ptMinTrackSize = sizeExtra + mmiChild.ptMinTrackSize;
\r
134 // min size is the largest
\r
137 lpMMI->ptMinTrackSize.x = __max(lpMMI->ptMinTrackSize.x,
\r
138 mmiChild.ptMinTrackSize.x);
\r
139 lpMMI->ptMinTrackSize.y = __max(lpMMI->ptMinTrackSize.y,
\r
140 mmiChild.ptMinTrackSize.y);
\r
142 // max size is the shortest
\r
145 lpMMI->ptMaxTrackSize.x = __min(lpMMI->ptMaxTrackSize.x,
\r
146 mmiChild.ptMaxTrackSize.x);
\r
147 lpMMI->ptMaxTrackSize.y = __min(lpMMI->ptMaxTrackSize.y,
\r
148 mmiChild.ptMaxTrackSize.y);
\r
152 void CResizableMinMax::SetMaximizedRect(const CRect& rc)
\r
154 m_bUseMaxRect = TRUE;
\r
156 m_ptMaxPos = rc.TopLeft();
\r
157 m_ptMaxSize.x = rc.Width();
\r
158 m_ptMaxSize.y = rc.Height();
\r
161 void CResizableMinMax::ResetMaximizedRect()
\r
163 m_bUseMaxRect = FALSE;
\r
166 void CResizableMinMax::SetMinTrackSize(const CSize& size)
\r
168 m_bUseMinTrack = TRUE;
\r
170 m_ptMinTrackSize.x = size.cx;
\r
171 m_ptMinTrackSize.y = size.cy;
\r
174 void CResizableMinMax::ResetMinTrackSize()
\r
176 m_bUseMinTrack = FALSE;
\r
179 void CResizableMinMax::SetMaxTrackSize(const CSize& size)
\r
181 m_bUseMaxTrack = TRUE;
\r
183 m_ptMaxTrackSize.x = size.cx;
\r
184 m_ptMaxTrackSize.y = size.cy;
\r
187 void CResizableMinMax::ResetMaxTrackSize()
\r
189 m_bUseMaxTrack = FALSE;
\r