source: trunk/src/user32/new/win32wbasepos.cpp@ 2396

Last change on this file since 2396 was 2396, checked in by cbratschi, 26 years ago

activated menu code

File size: 7.0 KB
Line 
1/* $Id: win32wbasepos.cpp,v 1.4 2000-01-10 17:18:11 cbratschi Exp $ */
2/*
3 * Win32 Window Base Class for OS/2 (nonclient/position methods)
4 *
5 * Copyright 1998-1999 Sander van Leeuwen (sandervl@xs4all.nl)
6 * Copyright 1999 Daniela Engert (dani@ngrt.de)
7 *
8 * Parts based on Wine Windows code (windows\win.c, windows\nonclient.c)
9 *
10 * Copyright 1993, 1994 Alexandre Julliard
11 *
12 * TODO: Not thread/process safe
13 *
14 * Wine code based on build 990815
15 *
16 * Project Odin Software License can be found in LICENSE.TXT
17 *
18 */
19#include <os2win.h>
20#include <win.h>
21#include <stdlib.h>
22#include <string.h>
23#include <stdarg.h>
24#include <assert.h>
25#include <misc.h>
26#include <win32wbase.h>
27#include <winres.h>
28#include <spy.h>
29#include "wndmsg.h"
30#include "oslibwin.h"
31#include "oslibutil.h"
32#include "oslibgdi.h"
33#include "oslibres.h"
34#include "oslibdos.h"
35#include "syscolor.h"
36#include "win32wndhandle.h"
37#include "dc.h"
38#include "pmframe.h"
39#include "win32wdesktop.h"
40
41 /* Some useful macros */
42#define HAS_DLGFRAME(style,exStyle) \
43 (((exStyle) & WS_EX_DLGMODALFRAME) || \
44 (((style) & WS_DLGFRAME) && !((style) & WS_THICKFRAME)))
45
46#define HAS_THICKFRAME(style,exStyle) \
47 (((style) & WS_THICKFRAME) && \
48 !((exStyle) & WS_EX_DLGMODALFRAME))
49
50#define HAS_THINFRAME(style) \
51 (((style) & WS_BORDER) || !((style) & (WS_CHILD | WS_POPUP)))
52
53#define HAS_BIGFRAME(style,exStyle) \
54 (((style) & (WS_THICKFRAME | WS_DLGFRAME)) || \
55 ((exStyle) & WS_EX_DLGMODALFRAME))
56
57#define HAS_ANYFRAME(style,exStyle) \
58 (((style) & (WS_THICKFRAME | WS_DLGFRAME | WS_BORDER)) || \
59 ((exStyle) & WS_EX_DLGMODALFRAME) || \
60 !((style) & (WS_CHILD | WS_POPUP)))
61
62#define HAS_3DFRAME(exStyle) \
63 ((exStyle & WS_EX_CLIENTEDGE) || (exStyle & WS_EX_STATICEDGE) || (exStyle & WS_EX_WINDOWEDGE))
64
65#define HAS_BORDER(style, exStyle) \
66 ((style & WS_BORDER) || HAS_THICKFRAME(style) || HAS_DLGFRAME(style,exStyle))
67
68#define IS_OVERLAPPED(style) \
69 !(style & (WS_CHILD | WS_POPUP))
70
71#define HAS_MENU() (!(getStyle() & WS_CHILD) && (GetMenu() != 0))
72
73/*******************************************************************
74 * GetMinMaxInfo
75 *
76 * Get the minimized and maximized information for a window.
77 */
78void Win32BaseWindow::GetMinMaxInfo(POINT *maxSize, POINT *maxPos,
79 POINT *minTrack, POINT *maxTrack )
80{
81 MINMAXINFO MinMax;
82 INT xinc, yinc;
83
84 /* Compute default values */
85
86 MinMax.ptMaxSize.x = GetSystemMetrics(SM_CXSCREEN);
87 MinMax.ptMaxSize.y = GetSystemMetrics(SM_CYSCREEN);
88 MinMax.ptMinTrackSize.x = GetSystemMetrics(SM_CXMINTRACK);
89 MinMax.ptMinTrackSize.y = GetSystemMetrics(SM_CYMINTRACK);
90 MinMax.ptMaxTrackSize.x = GetSystemMetrics(SM_CXSCREEN);
91 MinMax.ptMaxTrackSize.y = GetSystemMetrics(SM_CYSCREEN);
92
93 if (flags & WIN_MANAGED) xinc = yinc = 0;
94 else if (HAS_DLGFRAME( dwStyle, dwExStyle ))
95 {
96 xinc = GetSystemMetrics(SM_CXDLGFRAME);
97 yinc = GetSystemMetrics(SM_CYDLGFRAME);
98 }
99 else
100 {
101 xinc = yinc = 0;
102 if (HAS_THICKFRAME(dwStyle, dwExStyle))
103 {
104 xinc += GetSystemMetrics(SM_CXFRAME);
105 yinc += GetSystemMetrics(SM_CYFRAME);
106 }
107 if (dwStyle & WS_BORDER)
108 {
109 xinc += GetSystemMetrics(SM_CXBORDER);
110 yinc += GetSystemMetrics(SM_CYBORDER);
111 }
112 }
113 MinMax.ptMaxSize.x += 2 * xinc;
114 MinMax.ptMaxSize.y += 2 * yinc;
115
116#if 0
117 lpPos = (LPINTERNALPOS)GetPropA( hwndSelf, atomInternalPos );
118 if( lpPos && !EMPTYPOINT(lpPos->ptMaxPos) )
119 CONV_POINT16TO32( &lpPos->ptMaxPos, &MinMax.ptMaxPosition );
120 else
121 {
122#endif
123 MinMax.ptMaxPosition.x = -xinc;
124 MinMax.ptMaxPosition.y = -yinc;
125// }
126
127 SendInternalMessageA(WM_GETMINMAXINFO, 0, (LPARAM)&MinMax );
128
129 /* Some sanity checks */
130
131 dprintf(("GetMinMaxInfo: %ld %ld / %ld %ld / %ld %ld / %ld %ld\n",
132 MinMax.ptMaxSize.x, MinMax.ptMaxSize.y,
133 MinMax.ptMaxPosition.x, MinMax.ptMaxPosition.y,
134 MinMax.ptMaxTrackSize.x, MinMax.ptMaxTrackSize.y,
135 MinMax.ptMinTrackSize.x, MinMax.ptMinTrackSize.y));
136 MinMax.ptMaxTrackSize.x = MAX( MinMax.ptMaxTrackSize.x,
137 MinMax.ptMinTrackSize.x );
138 MinMax.ptMaxTrackSize.y = MAX( MinMax.ptMaxTrackSize.y,
139 MinMax.ptMinTrackSize.y );
140
141 if (maxSize) *maxSize = MinMax.ptMaxSize;
142 if (maxPos) *maxPos = MinMax.ptMaxPosition;
143 if (minTrack) *minTrack = MinMax.ptMinTrackSize;
144 if (maxTrack) *maxTrack = MinMax.ptMaxTrackSize;
145}
146/***********************************************************************
147 * WINPOS_SendNCCalcSize
148 *
149 * Send a WM_NCCALCSIZE message to a window.
150 * All parameters are read-only except newClientRect.
151 * oldWindowRect, oldClientRect and winpos must be non-NULL only
152 * when calcValidRect is TRUE.
153 */
154LONG Win32BaseWindow::SendNCCalcSize(BOOL calcValidRect, RECT *newWindowRect,
155 RECT *oldWindowRect,
156 RECT *oldClientRect, WINDOWPOS *winpos,
157 RECT *newClientRect )
158{
159 NCCALCSIZE_PARAMS params;
160 WINDOWPOS winposCopy;
161 LONG result;
162
163 params.rgrc[0] = *newWindowRect;
164 if (calcValidRect)
165 {
166 winposCopy = *winpos;
167 params.rgrc[1] = *oldWindowRect;
168 params.rgrc[2] = *oldClientRect;
169 params.lppos = &winposCopy;
170 }
171 result = SendInternalMessageA(WM_NCCALCSIZE, calcValidRect,
172 (LPARAM)&params );
173 if (calcValidRect)
174 {
175 /* If the application send back garbage, ignore it */
176 if (params.rgrc[2].left <= params.rgrc[2].right && params.rgrc[2].top <= params.rgrc[2].bottom)
177 *newClientRect = params.rgrc[2];
178 else
179 SetRectEmpty(newClientRect);
180 }
181
182 return result;
183}
184/***********************************************************************
185 * WINPOS_HandleWindowPosChanging16
186 *
187 * Default handling for a WM_WINDOWPOSCHANGING. Called from DefWindowProc().
188 */
189LONG Win32BaseWindow::HandleWindowPosChanging(WINDOWPOS *winpos)
190{
191 POINT maxSize, minTrack;
192 int rc = 1;
193
194 if (winpos->flags & SWP_NOSIZE)
195 return 1;
196
197 if ((getStyle() & WS_THICKFRAME) ||
198 ((getStyle() & (WS_POPUP | WS_CHILD)) == 0))
199 {
200 GetMinMaxInfo(&maxSize, NULL, &minTrack, NULL );
201 if (maxSize.x < winpos->cx) {
202 winpos->cx = maxSize.x;
203 rc = 0;
204 }
205 if (maxSize.y < winpos->cy) {
206 winpos->cy = maxSize.y;
207 rc = 0;
208 }
209 if (!(getStyle() & WS_MINIMIZE))
210 {
211 if (winpos->cx < minTrack.x ) {
212 winpos->cx = minTrack.x;
213 rc = 0;
214 }
215 if (winpos->cy < minTrack.y ) {
216 winpos->cy = minTrack.y;
217 rc = 0;
218 }
219 }
220 }
221 return rc;
222}
223//******************************************************************************
224//******************************************************************************
225
Note: See TracBrowser for help on using the repository browser.