1 /*=============================================================================
\r
3 *
\83_
\83C
\83A
\83\8d\83O
\83{
\83b
\83N
\83X
\82Ì
\83T
\83C
\83Y
\95Ï
\8dX
\8f\88\97\9d\r
5 ===============================================================================
\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.
\r
8 / Redistribution and use in source and binary forms, with or without
\r
9 / modification, are permitted provided that the following conditions
\r
12 / 1. Redistributions of source code must retain the above copyright
\r
13 / notice, this list of conditions and the following disclaimer.
\r
14 / 2. Redistributions in binary form must reproduce the above copyright
\r
15 / notice, this list of conditions and the following disclaimer in the
\r
16 / documentation and/or other materials provided with the distribution.
\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
\r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
\r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
\r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
\r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
\r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
\r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
\r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
28 /============================================================================*/
\r
31 #include <windows.h>
\r
35 #include <commctrl.h>
\r
36 #include <windowsx.h>
\r
39 #include "resource.h"
\r
42 /*---------------------------------------------------------------------------*/
\r
43 /*
\83T
\83C
\83Y
\95Ï
\8dX
\89Â
\94\
\82Æ
\82·
\82é
\83_
\83C
\83A
\83\8d\83O
\83{
\83b
\83N
\83X
\82Í WS_CLIPCHILDREN
\83X
\83^
\83C
\83\8b\82ð
\92Ç
\89Á
\82· */
\r
45 /*---------------------------------------------------------------------------*/
\r
48 /*-----
\83_
\83C
\83A
\83\8d\83O
\83{
\83b
\83N
\83X
\82Ì
\8f\89\8aú
\83T
\83C
\83Y
\82ð
\90Ý
\92è ----------------------------------
\r
51 * HWND hDlg :
\83E
\83C
\83\93\83h
\83E
\83n
\83\93\83h
\83\8b\r
52 * DIALOGSIZE *Dt :
\83_
\83C
\83A
\83\8d\83O
\83T
\83C
\83Y
\90Ý
\92è
\83p
\83\89\83\81\81[
\83^
\r
53 * SIZE *Size :
\83_
\83C
\83A
\83\8d\83O
\82Ì
\83T
\83C
\83Y
\r
57 *----------------------------------------------------------------------------*/
\r
59 void DlgSizeInit(HWND hDlg, DIALOGSIZE *Dt, SIZE *Size)
\r
63 GetWindowRect(hDlg, &Rect);
\r
64 Dt->MinSize.cx = Rect.right - Rect.left;
\r
65 Dt->MinSize.cy = Rect.bottom - Rect.top;
\r
66 Dt->CurSize.cx = Dt->MinSize.cx;
\r
67 Dt->CurSize.cy = Dt->MinSize.cy;
\r
71 Rect.right = Rect.left + Size->cx;
\r
72 Rect.bottom = Rect.top + Size->cy;
\r
74 DlgSizeChange(hDlg, Dt, &Rect, WMSZ_BOTTOMRIGHT);
\r
76 GetWindowRect(hDlg, &Rect);
\r
77 MoveWindow(hDlg, Rect.left, Rect.top, Dt->CurSize.cx, Dt->CurSize.cy, TRUE);
\r
83 /*-----
\83_
\83C
\83A
\83\8d\83O
\83{
\83b
\83N
\83X
\82Ì
\83T
\83C
\83Y
\82ð
\95Ô
\82· --------------------------------------
\r
86 * HWND hDlg :
\83E
\83C
\83\93\83h
\83E
\83n
\83\93\83h
\83\8b\r
87 * DIALOGSIZE *Dt :
\83_
\83C
\83A
\83\8d\83O
\83T
\83C
\83Y
\90Ý
\92è
\83p
\83\89\83\81\81[
\83^
\r
88 * SIZE *Size :
\83_
\83C
\83A
\83\8d\83O
\82Ì
\83T
\83C
\83Y
\82ð
\95Ô
\82·
\83\8f\81[
\83N
\r
92 *----------------------------------------------------------------------------*/
\r
94 void AskDlgSize(HWND hDlg, DIALOGSIZE *Dt, SIZE *Size)
\r
96 Size->cx = Dt->CurSize.cx;
\r
97 Size->cy = Dt->CurSize.cy;
\r
103 /*-----
\83_
\83C
\83A
\83\8d\83O
\83{
\83b
\83N
\83X
\82Ì
\83T
\83C
\83Y
\95Ï
\8dX
\8f\88\97\9d ------------------------------------
\r
106 * HWND hDlg :
\83E
\83C
\83\93\83h
\83E
\83n
\83\93\83h
\83\8b\r
107 * DIALOGSIZE *Dt :
\83_
\83C
\83A
\83\8d\83O
\83T
\83C
\83Y
\90Ý
\92è
\83p
\83\89\83\81\81[
\83^
\r
108 * RECT *New :
\90V
\82µ
\82¢
\83_
\83C
\83A
\83\8d\83O
\82Ì
\83T
\83C
\83Y
\r
109 * int Flg :
\83T
\83C
\83Y
\95Ï
\8dX
\95û
\8cü (WMSZ_xxx)
\r
115 *
\83_
\83C
\83A
\83\8d\83O
\83{
\83b
\83N
\83X
\82É WM_SIZING
\83\81\83b
\83Z
\81[
\83W
\82ª
\97\88\82½
\8e\9e\82É
\8cÄ
\82Ô
\8e\96\r
116 *----------------------------------------------------------------------------*/
\r
118 void DlgSizeChange(HWND hDlg, DIALOGSIZE *Dt, RECT *New, int Flg)
\r
124 /*
\8dÅ
\8f
\83T
\83C
\83Y
\82æ
\82è
\8f¬
\82³
\82
\82È
\82ç
\82È
\82¢
\82æ
\82¤
\82É
\82·
\82é
\8f\88\97\9d */
\r
125 if((New->right - New->left) < Dt->MinSize.cx)
\r
127 if((Flg == WMSZ_LEFT) || (Flg == WMSZ_TOPLEFT) || (Flg == WMSZ_BOTTOMLEFT))
\r
128 New->left = New->right - Dt->MinSize.cx;
\r
130 New->right = New->left + Dt->MinSize.cx;
\r
132 if((New->bottom - New->top) < Dt->MinSize.cy)
\r
134 if((Flg == WMSZ_TOP) || (Flg == WMSZ_TOPLEFT) || (Flg == WMSZ_TOPRIGHT))
\r
135 New->top = New->bottom - Dt->MinSize.cy;
\r
137 New->bottom = New->top + Dt->MinSize.cy;
\r
140 /*
\90\85\95½
\95û
\8cü
\82É
\88Ú
\93®
\82·
\82é
\95\94\95i
\82Ì
\8f\88\97\9d */
\r
141 if(Dt->CurSize.cx != New->right - New->left)
\r
143 Win = Dt->HorMoveList;
\r
146 GetWindowRect(GetDlgItem(hDlg, *Win), &Rect);
\r
147 Point.x = Rect.left + (New->right - New->left) - Dt->CurSize.cx;
\r
148 Point.y = Rect.top;
\r
149 ScreenToClient(hDlg, &Point);
\r
151 GetClientRect(GetDlgItem(hDlg, *Win), &Rect);
\r
152 Rect.left = Point.x;
\r
153 Rect.top = Point.y;
\r
154 MoveWindow(GetDlgItem(hDlg, *Win), Rect.left, Rect.top, Rect.right, Rect.bottom, FALSE);
\r
160 /*
\90\82\92¼
\95û
\8cü
\82É
\88Ú
\93®
\82·
\82é
\95\94\95i
\82Ì
\8f\88\97\9d */
\r
161 if(Dt->CurSize.cy != New->bottom - New->top)
\r
163 Win = Dt->VarMoveList;
\r
166 GetWindowRect(GetDlgItem(hDlg, *Win), &Rect);
\r
167 Point.x = Rect.left;
\r
168 Point.y = Rect.top + (New->bottom - New->top) - Dt->CurSize.cy;
\r
169 ScreenToClient(hDlg, &Point);
\r
171 GetClientRect(GetDlgItem(hDlg, *Win), &Rect);
\r
172 Rect.left = Point.x;
\r
173 Rect.top = Point.y;
\r
174 MoveWindow(GetDlgItem(hDlg, *Win), Rect.left, Rect.top, Rect.right, Rect.bottom, FALSE);
\r
180 /*
\91å
\82«
\82³
\82ð
\95Ï
\8dX
\82·
\82é
\95\94\95i
\82Ì
\8f\88\97\9d */
\r
181 if((Dt->CurSize.cx != New->right - New->left) ||
\r
182 (Dt->CurSize.cy != New->bottom - New->top))
\r
184 Win = Dt->ResizeList;
\r
187 GetWindowRect(GetDlgItem(hDlg, *Win), &Rect);
\r
188 Rect.right = (Rect.right - Rect.left) + (New->right - New->left) - Dt->CurSize.cx;
\r
189 Rect.bottom = (Rect.bottom - Rect.top) + (New->bottom - New->top) - Dt->CurSize.cy;
\r
191 Point.x = Rect.left;
\r
192 Point.y = Rect.top;
\r
193 ScreenToClient(hDlg, &Point);
\r
194 Rect.left = Point.x;
\r
195 Rect.top = Point.y;
\r
197 MoveWindow(GetDlgItem(hDlg, *Win), Rect.left, Rect.top, Rect.right, Rect.bottom, FALSE);
\r
204 Dt->CurSize.cx = New->right - New->left;
\r
205 Dt->CurSize.cy = New->bottom - New->top;
\r
206 InvalidateRect(hDlg, NULL, FALSE);
\r