source: trunk/src/user32/pmframe.cpp@ 1279

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

pmframe finished

File size: 8.8 KB
Line 
1/* $Id: pmframe.cpp,v 1.4 1999-10-11 16:04:51 cbratschi Exp $ */
2/*
3 * Win32 Frame Managment Code for OS/2
4 *
5 * Copyright 1999 by Christoph Bratschi (cbratschi@datacomm.ch)
6 *
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12#define INCL_WIN
13#define INCL_GPI
14
15#include <os2.h> /* PM header file */
16#include <os2wrap.h>
17#include <stdlib.h>
18#include "win32type.h"
19#include <misc.h>
20#include <win32wbase.h>
21#include "wprocess.h"
22#include "pmframe.h"
23#include "oslibutil.h"
24
25#define PMFRAMELOG
26
27VOID Draw3DRect(HPS hps,RECTL rect,LONG colorBR,LONG colorTL)
28{
29 POINTL point;
30
31 GpiSetColor(hps,colorBR);
32 point.x = rect.xLeft;
33 point.y = rect.yBottom;
34 GpiMove(hps,&point);
35 point.x = rect.xRight-1;
36 GpiLine(hps,&point);
37 point.y = rect.yTop-1;
38 GpiLine(hps,&point);
39 GpiSetColor(hps,colorTL);
40 point.x--;
41 GpiMove(hps,&point);
42 point.x = rect.xLeft;
43 GpiLine(hps,&point);
44 point.y = rect.yBottom+1;
45 GpiLine(hps,&point);
46}
47
48VOID DeflateRect(RECTL *rect)
49{
50 rect->xLeft++;
51 rect->xRight--;
52 rect->yTop--;
53 rect->yBottom++;
54}
55
56VOID DrawFrame(HPS hps,RECTL *rect,Win32BaseWindow *win32wnd)
57{
58 LONG clrWhite,clrBlack,clrDark,clrLight;
59 POINTL point;
60 DWORD dwExStyle = win32wnd->getExStyle();
61 DWORD dwStyle = win32wnd->getStyle();
62
63 clrWhite = CLR_WHITE;
64 clrBlack = CLR_BLACK;
65 clrLight = CLR_PALEGRAY;
66 clrDark = CLR_DARKGRAY;
67
68 if (dwExStyle & WS_EX_CLIENTEDGE_W)
69 {
70 Draw3DRect(hps,*rect,clrWhite,clrDark);
71 DeflateRect(rect);
72 Draw3DRect(hps,*rect,clrLight,clrBlack);
73 } else if (dwExStyle & WS_EX_DLGMODALFRAME_W)
74 {
75 Draw3DRect(hps,*rect,clrBlack,clrLight);
76 DeflateRect(rect);
77 Draw3DRect(hps,*rect,clrDark,clrWhite);
78 DeflateRect(rect);
79 Draw3DRect(hps,*rect,clrLight,clrLight);
80 } else if (dwExStyle & WS_EX_STATICEDGE_W)
81 {
82 Draw3DRect(hps,*rect,clrWhite,clrDark);
83 } else if (dwExStyle & WS_EX_WINDOWEDGE_W);
84 else if (dwStyle & WS_BORDER_W)
85 {
86 Draw3DRect(hps,*rect,clrBlack,clrBlack);
87 }
88
89 DeflateRect(rect);
90}
91
92BOOL CanDrawSizeBox(Win32BaseWindow *win32wnd)
93{
94 return (!win32wnd->isChild() && WinQueryWindowULong(win32wnd->getOS2FrameWindowHandle(),QWL_STYLE) & FS_SIZEBORDER
95 && win32wnd->getVertScrollHandle() && WinQueryWindow(win32wnd->getVertScrollHandle(),QW_PARENT) == win32wnd->getOS2FrameWindowHandle()
96 && win32wnd->getHorzScrollHandle() && WinQueryWindow(win32wnd->getHorzScrollHandle(),QW_PARENT) == win32wnd->getOS2FrameWindowHandle());
97}
98
99VOID GetSizeBox(Win32BaseWindow *win32wnd,RECTL *rect)
100{
101 SWP swpHorz,swpVert;
102
103 WinQueryWindowPos(win32wnd->getVertScrollHandle(),&swpVert);
104 WinQueryWindowPos(win32wnd->getHorzScrollHandle(),&swpHorz);
105 rect->xLeft = swpVert.x;
106 rect->xRight = swpVert.x+swpVert.cx;
107 rect->yTop = swpHorz.y+swpHorz.cy;
108 rect->yBottom = swpHorz.y;
109}
110
111BOOL InSizeBox(Win32BaseWindow *win32wnd,POINTS *points)
112{
113 if (CanDrawSizeBox(win32wnd))
114 {
115 RECTL rect;
116 POINTL point;
117
118 point.x = points->x;
119 point.y = points->y;
120 GetSizeBox(win32wnd,&rect);
121 return (WinPtInRect(GetThreadHAB(),&rect,&point));
122 }
123
124 return FALSE;
125}
126
127VOID DrawSizeBox(HPS hps,RECTL rect)
128{
129 POINTL p1,p2;
130 LONG clrDark = CLR_DARKGRAY,clrWhite = CLR_WHITE;
131 INT x;
132
133 WinFillRect(hps,&rect,SYSCLR_DIALOGBACKGROUND);
134 p1.x = rect.xRight-2;
135 p1.y = rect.yBottom;
136 p2.x = rect.xRight-1;
137 p2.y = rect.yBottom+1;
138 for (x = 0;x < 3;x++)
139 {
140 GpiSetColor(hps,clrDark);
141 GpiMove(hps,&p1);
142 GpiLine(hps,&p2);
143 p1.x--;
144 p2.y++;
145 GpiMove(hps,&p1);
146 GpiLine(hps,&p2);
147 GpiSetColor(hps,clrWhite);
148 p1.x--;
149 p2.y++;
150 GpiMove(hps,&p1);
151 GpiLine(hps,&p2);
152 p1.x -= 2;
153 p2.y += 2;
154 }
155}
156
157//******************************************************************************
158//Win32 frame message handler
159//******************************************************************************
160MRESULT EXPENTRY Win32FrameProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
161{
162 Win32BaseWindow *win32wnd;
163 PFNWP OldFrameProc;
164
165 SetWin32TIB();
166
167 win32wnd = Win32BaseWindow::GetWindowFromOS2FrameHandle(hwnd);
168
169 if(win32wnd == NULL || !win32wnd->getOldFrameProc())
170 {
171 dprintf(("Invalid win32wnd pointer for frame %x!!", hwnd));
172 goto RunDefWndProc;
173 }
174
175 OldFrameProc = (PFNWP)win32wnd->getOldFrameProc();
176
177 switch(msg)
178 {
179 case WM_DESTROY:
180 #ifdef PMFRAMELOG
181 dprintf(("PMFRAME: WM_DESTROY"));
182 #endif
183 WinSubclassWindow(hwnd,OldFrameProc);
184 win32wnd->setOldFrameProc(NULL);
185 goto RunDefFrameProc;
186
187 case WM_MOUSEMOVE:
188 #ifdef PMFRAMELOG
189 dprintf(("PMFRAME: WM_MOUSEMOVE"));
190 #endif
191 if (InSizeBox(win32wnd,(POINTS*)&mp1))
192 {
193 WinSetPointer(HWND_DESKTOP,WinQuerySysPointer(HWND_DESKTOP,SPTR_SIZENWSE,FALSE));
194 RestoreOS2TIB();
195 return (MRESULT)TRUE;
196 } else if (win32wnd->isChild()) goto RunDefWndProc;
197 else goto RunDefFrameProc;
198
199 case WM_BUTTON1DOWN:
200 #ifdef PMFRAMELOG
201 dprintf(("PMFRAME: WM_BUTTON1DOWN"));
202 #endif
203 if (InSizeBox(win32wnd,(POINTS*)&mp1))
204 {
205 WinSendMsg(hwnd,WM_TRACKFRAME,(MPARAM)(TF_RIGHT | TF_BOTTOM),(MPARAM)0);
206 RestoreOS2TIB();
207 return (MRESULT)TRUE;
208 } else if (win32wnd->isChild()) goto RunDefWndProc;
209 else goto RunDefFrameProc;
210
211 case WM_BUTTON2DOWN:
212 case WM_BUTTON3DOWN:
213 #ifdef PMFRAMELOG
214 dprintf(("PMFRAME: WM_BUTTON2/3DOWN"));
215 #endif
216 if (win32wnd->isChild()) goto RunDefWndProc;
217 else goto RunDefFrameProc;
218
219 case WM_ACTIVATE:
220 #ifdef PMFRAMELOG
221 dprintf(("PMFRAME: WM_ACTIVATE"));
222 #endif
223 if (!win32wnd->isChild())
224 {
225 if (CanDrawSizeBox(win32wnd))
226 {
227 MRESULT res;
228 HPS hps;
229 RECTL rect;
230
231 RestoreOS2TIB();
232 res = OldFrameProc(hwnd,msg,mp1,mp2);
233 SetWin32TIB();
234
235 GetSizeBox(win32wnd,&rect);
236 hps = WinGetPS(hwnd);
237 DrawSizeBox(hps,rect);
238 WinReleasePS(hps);
239
240 RestoreOS2TIB();
241 return res;
242 } else goto RunDefFrameProc;
243 } else
244 {
245 MRESULT res;
246 HPS hps;
247 RECTL rect;
248
249 RestoreOS2TIB();
250 res = OldFrameProc(hwnd,msg,mp1,mp2);
251 SetWin32TIB();
252
253 hps = WinGetClipPS(hwnd,0,PSF_CLIPCHILDREN);
254 WinQueryWindowRect(hwnd,&rect);
255 DrawFrame(hps,&rect,win32wnd);
256 WinFillRect(hps,&rect,SYSCLR_DIALOGBACKGROUND);
257 WinReleasePS(hps);
258
259 RestoreOS2TIB();
260 return res;
261 }
262
263 case WM_PAINT:
264 #ifdef PMFRAMELOG
265 dprintf(("PMFRAME: WM_PAINT"));
266 #endif
267 if (!win32wnd->isChild())
268 {
269 if (CanDrawSizeBox(win32wnd))
270 {
271 MRESULT res;
272 HPS hps;
273 RECTL rect;
274
275 RestoreOS2TIB();
276 res = OldFrameProc(hwnd,msg,mp1,mp2);
277 SetWin32TIB();
278
279 GetSizeBox(win32wnd,&rect);
280 hps = WinGetPS(hwnd);
281 DrawSizeBox(hps,rect);
282 WinReleasePS(hps);
283
284 RestoreOS2TIB();
285 return res;
286 } else goto RunDefFrameProc;
287 } else
288 {
289 RECTL rect;
290 HPS hps = WinBeginPaint(hwnd,0,&rect);
291
292 DrawFrame(hps,&rect,win32wnd);
293 WinFillRect(hps,&rect,SYSCLR_DIALOGBACKGROUND);
294 WinEndPaint(hps);
295
296 RestoreOS2TIB();
297 return (MRESULT)0;
298 }
299
300 default:
301 RestoreOS2TIB();
302 return OldFrameProc(hwnd,msg,mp1,mp2);
303 }
304
305 RestoreOS2TIB();
306 return (MRESULT)FALSE;
307
308RunDefFrameProc:
309 RestoreOS2TIB();
310 return OldFrameProc(hwnd,msg,mp1,mp2);
311
312RunDefWndProc:
313 RestoreOS2TIB();
314 return WinDefWindowProc(hwnd,msg,mp1,mp2);
315}
316
317PVOID FrameSubclassFrameWindow(Win32BaseWindow *win32wnd)
318{
319 return WinSubclassWindow(win32wnd->getOS2FrameWindowHandle(),PFNWP(Win32FrameProc));
320}
321
322VOID FrameGetBorderSize(Win32BaseWindow *win32wnd,PWPOINT pSize)
323{
324 WinSendMsg(win32wnd->getOS2FrameWindowHandle(),WM_QUERYBORDERSIZE,(MPARAM)pSize,(MPARAM)0);
325}
326
327VOID FrameSetBorderSize(Win32BaseWindow *win32wnd,BOOL resize)
328{
329 POINTL point;
330
331 if (!resize)
332 {
333 WinSendMsg(win32wnd->getOS2FrameWindowHandle(),WM_SETBORDERSIZE,(MPARAM)win32wnd->getBorderWidth(),(MPARAM)win32wnd->getBorderHeight());
334
335 return;
336 }
337
338 FrameGetBorderSize(win32wnd,&point);
339 WinSendMsg(win32wnd->getOS2FrameWindowHandle(),WM_SETBORDERSIZE,(MPARAM)win32wnd->getBorderWidth(),(MPARAM)win32wnd->getBorderHeight());
340 if (point.x != win32wnd->getBorderWidth() || point.y != win32wnd->getBorderHeight())
341 {
342 INT xDiff = win32wnd->getBorderWidth()-point.x;
343 INT yDiff = win32wnd->getBorderHeight()-point.y;
344 SWP swp;
345
346 WinQueryWindowPos(win32wnd->getOS2FrameWindowHandle(),&swp);
347 swp.x += xDiff;
348 swp.y += yDiff;
349 swp.cx -= 2*xDiff;
350 swp.cy -= 2*yDiff;
351 WinSetWindowPos(win32wnd->getOS2FrameWindowHandle(),0,swp.x,swp.y,swp.cx,swp.cy,SWP_MOVE | SWP_SIZE);
352 }
353}
354
355UINT FrameGetDefSizeBorderSize(VOID)
356{
357 return WinQuerySysValue(HWND_DESKTOP,SV_CXSIZEBORDER);
358}
Note: See TracBrowser for help on using the repository browser.