1993-09-04 12:09:32 +02:00
|
|
|
/*
|
|
|
|
* Rectangle-related functions
|
|
|
|
*
|
|
|
|
* Copyright 1993 Alexandre Julliard
|
|
|
|
*/
|
|
|
|
|
|
|
|
static char Copyright[] = "Copyright Alexandre Julliard, 1993";
|
|
|
|
|
|
|
|
#include "windows.h"
|
|
|
|
|
|
|
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
|
|
|
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* SetRect (USER.72)
|
|
|
|
*/
|
|
|
|
void SetRect( LPRECT rect, short left, short top, short right, short bottom )
|
|
|
|
{
|
|
|
|
rect->left = left;
|
|
|
|
rect->right = right;
|
|
|
|
rect->top = top;
|
|
|
|
rect->bottom = bottom;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* SetRectEmpty (USER.73)
|
|
|
|
*/
|
|
|
|
void SetRectEmpty( LPRECT rect )
|
|
|
|
{
|
|
|
|
rect->left = rect->right = rect->top = rect->bottom = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* CopyRect (USER.74)
|
|
|
|
*/
|
|
|
|
void CopyRect( LPRECT dest, LPRECT src )
|
|
|
|
{
|
|
|
|
*dest = *src;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* IsRectEmpty (USER.75)
|
|
|
|
*/
|
|
|
|
BOOL IsRectEmpty( LPRECT rect )
|
|
|
|
{
|
|
|
|
return ((rect->left == rect->right) || (rect->top == rect->bottom));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* PtInRect (USER.76)
|
|
|
|
*/
|
|
|
|
BOOL PtInRect( LPRECT rect, POINT pt )
|
|
|
|
{
|
|
|
|
return ((pt.x >= rect->left) && (pt.x < rect->right) &&
|
|
|
|
(pt.y >= rect->top) && (pt.y < rect->bottom));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* OffsetRect (USER.77)
|
|
|
|
*/
|
|
|
|
void OffsetRect( LPRECT rect, short x, short y )
|
|
|
|
{
|
|
|
|
rect->left += x;
|
|
|
|
rect->right += x;
|
|
|
|
rect->top += y;
|
|
|
|
rect->bottom += y;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* InflateRect (USER.78)
|
|
|
|
*/
|
|
|
|
void InflateRect( LPRECT rect, short x, short y )
|
|
|
|
{
|
1993-09-29 13:21:49 +01:00
|
|
|
rect->left -= x;
|
|
|
|
rect->top -= y;
|
1993-09-04 12:09:32 +02:00
|
|
|
rect->right += x;
|
|
|
|
rect->bottom += y;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* IntersectRect (USER.79)
|
|
|
|
*/
|
|
|
|
BOOL IntersectRect( LPRECT dest, LPRECT src1, LPRECT src2 )
|
|
|
|
{
|
|
|
|
if ((src1->left >= src2->right) || (src2->left >= src1->right) ||
|
|
|
|
(src1->top >= src2->bottom) || (src2->top >= src1->bottom))
|
|
|
|
{
|
|
|
|
SetRectEmpty( dest );
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
dest->left = MAX( src1->left, src2->left );
|
|
|
|
dest->right = MIN( src1->right, src2->right );
|
|
|
|
dest->top = MAX( src1->top, src2->top );
|
|
|
|
dest->bottom = MIN( src1->bottom, src2->bottom );
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* UnionRect (USER.80)
|
|
|
|
*/
|
|
|
|
BOOL UnionRect( LPRECT dest, LPRECT src1, LPRECT src2 )
|
|
|
|
{
|
|
|
|
if (IsRectEmpty(src1))
|
|
|
|
{
|
|
|
|
if (IsRectEmpty(src2))
|
|
|
|
{
|
|
|
|
SetRectEmpty( dest );
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else *dest = *src2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (IsRectEmpty(src2)) *dest = *src1;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dest->left = MIN( src1->left, src2->left );
|
|
|
|
dest->right = MAX( src1->right, src2->right );
|
|
|
|
dest->top = MIN( src1->top, src2->top );
|
|
|
|
dest->bottom = MAX( src1->bottom, src2->bottom );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* EqualRect (USER.244)
|
|
|
|
*/
|
|
|
|
BOOL EqualRect( LPRECT rect1, LPRECT rect2 )
|
|
|
|
{
|
|
|
|
return ((rect1->left == rect2->left) && (rect1->right == rect2->right) &&
|
|
|
|
(rect1->top == rect2->top) && (rect1->bottom == rect2->bottom));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* SubtractRect (USER.373)
|
|
|
|
*/
|
|
|
|
BOOL SubtractRect( LPRECT dest, LPRECT src1, LPRECT src2 )
|
|
|
|
{
|
|
|
|
RECT tmp;
|
|
|
|
*dest = *src1;
|
|
|
|
if (IntersectRect( &tmp, src1, src2 ))
|
|
|
|
{
|
Release 0.6
Tue Jan 4 13:01:33 1994 David Metcalfe <david@prism.demon.co.uk>
* [window/caret.c]
Modified code to use system timer.
Jan 9, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)
* [windows/win.c]
Windows create if required new XLIB MenuBar & CaptionBar.
* [windows/defwnd.c]
WM_CALCSIZE Move & Resize caption, menubar & scrollbars.
(I'm not sure it's the good place for it, but it work...)
* [loader/resource.c]
optimize in FindResourceByNumber, make lseek() if next type ...
* [controls/scroll.c]
scrollbar buttons are now using system resources bitmaps.
* [controls/caption.c] - new file ...
captionbar showing title, close button with SysMenu,
and other buttons using system resources bitmaps.
* [controls/menu.c]
New functions: SetMenuItemBitmaps() with 'glues',
Make new version of LoadMenu() & ParseMenu(),
( put #define USE_POPUPMENU ).
Implementation of MenuBar functions.
* [sysres.dll]
New bitmaps for system such OBM_CLOSE, OBM_MINIMIZE, OBM_UPARROWI.
New SYSMENU menu, it don't work yet ! :-((
Tue Jan 11 05:27:45 1994 julliard@di.epfl.ch (Alexandre Julliard
* [memory/atom.c]
Fixed a bug that could cause atoms to be case-sensitive.
* [misc/rect.c]
Bug fix in SubtractRect().
* [objects/clipping.c]
Bug fix when setting the clip mask to an empty region.
* [windows/dce.c]
Bug fix in ReleaseDC().
* [windows/dialog.c]
Call AdjustWindowRectEx() before creating the dialog window.
Added support for DS_MODALFRAME style.
* [windows/event.c]
Cleaned up event handling and removed old Xt stuff.
Moved double-click handling to windows/message.c
* [windows/focus.c]
Bug fix: only set the X focus when the window is viewable.
* [windows/graphics.c]
Rewritten DrawReliefRect() to use brush instead of pen, and
to use the system colors.
* [windows/message.c]
Implemented WM_NCHITTEST message sending, and non-client
mouse messages.
Cleaned up double-click handling, and removed the Xt code.
* [windows/nonclient.c] (New file)
Implemented AdjustWindowRect().
Implemented WM_NCCALCSIZE, WM_NCHITTEST and WM_NCPAINT handling.
* [windows/painting.c]
Added sending of the WM_NCPAINT message in BeginPaint().
* [windows/sysmetrics.c] [include/sysmetrics.h] (New files)
Implemented system metrics.
* [windows/win.c]
Bug fix in setting the parent and owner in CreateWindow().
Removed the Xt code.
* [windows/winpos.c]
Added sending of the WM_NCPAINT message in SetWindowPos().
Removed the Xt code.
1994-01-12 12:12:51 +01:00
|
|
|
if (EqualRect( &tmp, dest ))
|
|
|
|
{
|
|
|
|
SetRectEmpty( dest );
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
if ((tmp.top == dest->top) && (tmp.bottom == dest->bottom))
|
1993-09-04 12:09:32 +02:00
|
|
|
{
|
|
|
|
if (tmp.left == dest->left) dest->right = tmp.right;
|
|
|
|
else if (tmp.right == dest->right) dest->left = tmp.left;
|
|
|
|
}
|
|
|
|
else if ((tmp.left == dest->left) && (tmp.right == dest->right))
|
|
|
|
{
|
|
|
|
if (tmp.top == dest->top) dest->bottom = tmp.bottom;
|
|
|
|
else if (tmp.bottom == dest->bottom) dest->top = tmp.top;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|