Release 940722
Mon Jul 18 23:55:13 MET DST 1994
* [if1632/call.S]
CallTo16(): added `mov %eax,%edx' just before lcall,
to make sure that DX contain the DLL's hinstance when
initialised.
CallTo32_16() added, equal to CallTo32() except for
one thing: it saves DX and
* [tools/build.c]
Added some code to support 16 and 32 bit return values.
* [1632/{kernel,user}.spec]
Changed most of the `pascal' style to pascal_16 when
function returned a 16bit value.
Tue Jul 19 18:40:25 1994 Alexandre Julliard (julliard@lamisun.epfl.ch)
* [controls/menu.c]
Reorganized sizing and drawing code to implement multi-line menus.
Implemented MENUBREAK style.
Use system colors to draw menus.
* [objects/color.c]
Bug fix in COLOR_IsSolid().
* [objects/font.c]
Bug fix in FONT_GetMetrics(): calculate average character width
only on existing chars (dialogs look much better).
* [objects/text.c]
Bug fix in DrawText(): use text color to underline mnemonic.
* [windows/nonclient.c]
Changed WM_NCHITTEST handling to cope with multi-line menu bars.
* [windows/syscolor.c]
Added system objects for menu colors.
Mon Jul 18 19:32:08 PDT 1994 Andrew Lagodzinski (andrew@netcom.com)
* [controls/menu.c]
Fixed bug in SelectPrevItem that caused seperators to not be
skipped when using the up arrow key.
diff --git a/windows/nonclient.c b/windows/nonclient.c
index edc5ac2..c364b02 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -27,7 +27,8 @@
extern void WINPOS_GetMinMaxInfo( HWND hwnd, POINT *maxSize, POINT *maxPos,
POINT *minTrack, POINT *maxTrack ); /* winpos.c */
extern void CURSOR_SetWinCursor( HWND hwnd, HCURSOR hcursor ); /* cursor.c */
-extern WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth ); /* menu.c */
+extern WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth,
+ int orgX, int orgY ); /* menu.c */
/* Some useful macros */
@@ -127,7 +128,8 @@
if (HAS_MENU(wndPtr))
{
params->rgrc[0].top += MENU_GetMenuBarHeight( hwnd,
- params->rgrc[0].right - params->rgrc[0].left );
+ params->rgrc[0].right - params->rgrc[0].left,
+ -tmpRect.left, -tmpRect.top ) + 1;
}
return 0;
}
@@ -178,43 +180,61 @@
GetWindowRect( hwnd, &rect );
if (!PtInRect( &rect, pt )) return HTNOWHERE;
- ScreenToClient( hwnd, &pt );
- GetClientRect( hwnd, &rect );
-
- if (PtInRect( &rect, pt )) return HTCLIENT;
- /* Check vertical scroll bar */
- if (wndPtr->dwStyle & WS_VSCROLL)
- {
- rect.right += SYSMETRICS_CXVSCROLL;
- if (PtInRect( &rect, pt )) return HTVSCROLL;
- }
+ /* Check borders */
- /* Check horizontal scroll bar */
- if (wndPtr->dwStyle & WS_HSCROLL)
+ if (HAS_THICKFRAME( wndPtr->dwStyle ))
{
- rect.bottom += SYSMETRICS_CYHSCROLL;
- if (PtInRect( &rect, pt ))
+ InflateRect( &rect, -SYSMETRICS_CXFRAME, -SYSMETRICS_CYFRAME );
+ if (wndPtr->dwStyle & WS_BORDER)
+ InflateRect( &rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER );
+ if (!PtInRect( &rect, pt ))
{
- /* Check size box */
- if ((wndPtr->dwStyle & WS_VSCROLL) &&
- (pt.x >= rect.right - SYSMETRICS_CXVSCROLL)) return HTSIZE;
- return HTHSCROLL;
+ /* Check top sizing border */
+ if (pt.y < rect.top)
+ {
+ if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT;
+ if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT;
+ return HTTOP;
+ }
+ /* Check bottom sizing border */
+ if (pt.y >= rect.bottom)
+ {
+ if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT;
+ if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT;
+ return HTBOTTOM;
+ }
+ /* Check left sizing border */
+ if (pt.x < rect.left)
+ {
+ if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT;
+ if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT;
+ return HTLEFT;
+ }
+ /* Check right sizing border */
+ if (pt.x >= rect.right)
+ {
+ if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT;
+ if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT;
+ return HTRIGHT;
+ }
}
}
-
- /* Check menu */
- if (HAS_MENU(wndPtr))
+ else /* No thick frame */
{
- rect.top -= SYSMETRICS_CYMENU + 1;
- if (PtInRect( &rect, pt )) return HTMENU;
+ if (HAS_DLGFRAME( wndPtr->dwStyle, wndPtr->dwExStyle ))
+ InflateRect(&rect, -SYSMETRICS_CXDLGFRAME, -SYSMETRICS_CYDLGFRAME);
+ else if (wndPtr->dwStyle & WS_BORDER)
+ InflateRect(&rect, -SYSMETRICS_CXBORDER, -SYSMETRICS_CYBORDER);
+ if (!PtInRect( &rect, pt )) return HTBORDER;
}
/* Check caption */
+
if ((wndPtr->dwStyle & WS_CAPTION) == WS_CAPTION)
{
- rect.top -= SYSMETRICS_CYCAPTION - 1;
- if (PtInRect( &rect, pt ))
+ rect.top += SYSMETRICS_CYCAPTION - 1;
+ if (!PtInRect( &rect, pt ))
{
/* Check system menu */
if ((wndPtr->dwStyle & WS_SYSMENU) && (pt.x <= SYSMETRICS_CXSIZE))
@@ -230,40 +250,42 @@
return HTCAPTION;
}
}
-
- /* Check non-sizing border */
- if (!HAS_THICKFRAME( wndPtr->dwStyle )) return HTBORDER;
- /* Check top sizing border */
- if (pt.y < rect.top)
+ /* Check client area */
+
+ ScreenToClient( hwnd, &pt );
+ GetClientRect( hwnd, &rect );
+ if (PtInRect( &rect, pt )) return HTCLIENT;
+
+ /* Check vertical scroll bar */
+
+ if (wndPtr->dwStyle & WS_VSCROLL)
{
- if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTTOPLEFT;
- if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTTOPRIGHT;
- return HTTOP;
+ rect.right += SYSMETRICS_CXVSCROLL;
+ if (PtInRect( &rect, pt )) return HTVSCROLL;
}
- /* Check bottom sizing border */
- if (pt.y >= rect.bottom)
+ /* Check horizontal scroll bar */
+
+ if (wndPtr->dwStyle & WS_HSCROLL)
{
- if (pt.x < rect.left+SYSMETRICS_CXSIZE) return HTBOTTOMLEFT;
- if (pt.x >= rect.right-SYSMETRICS_CXSIZE) return HTBOTTOMRIGHT;
- return HTBOTTOM;
- }
-
- /* Check left sizing border */
- if (pt.x < rect.left)
- {
- if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPLEFT;
- if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMLEFT;
- return HTLEFT;
+ rect.bottom += SYSMETRICS_CYHSCROLL;
+ if (PtInRect( &rect, pt ))
+ {
+ /* Check size box */
+ if ((wndPtr->dwStyle & WS_VSCROLL) &&
+ (pt.x >= rect.right - SYSMETRICS_CXVSCROLL))
+ return HTSIZE;
+ return HTHSCROLL;
+ }
}
- /* Check right sizing border */
- if (pt.x >= rect.right)
+ /* Check menu bar */
+
+ if (HAS_MENU(wndPtr))
{
- if (pt.y < rect.top+SYSMETRICS_CYSIZE) return HTTOPRIGHT;
- if (pt.y >= rect.bottom-SYSMETRICS_CYSIZE) return HTBOTTOMRIGHT;
- return HTRIGHT;
+ if ((pt.y < 0) && (pt.x >= 0) && (pt.x < rect.right))
+ return HTMENU;
}
/* Should never get here */
@@ -537,9 +559,9 @@
#ifdef DEBUG_NONCLIENT
printf( "NC_DoNCPaint: %d %d\n", hwnd, hrgn );
#endif
- if (!IsWindowVisible(hwnd)) return;
if (!wndPtr || !hrgn) return;
- if (!(wndPtr->dwStyle & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME)))
+ if ((!(wndPtr->dwStyle & (WS_BORDER | WS_DLGFRAME | WS_THICKFRAME))) ||
+ (!(wndPtr->dwStyle & WS_VISIBLE)))
return; /* Nothing to do! */
if (hrgn == 1) hdc = GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW );
@@ -594,27 +616,15 @@
NC_DrawCaption( hdc, &r, hwnd, wndPtr->dwStyle, active );
}
- if (wndPtr->wIDmenu != 0 &&
- (wndPtr->dwStyle & WS_CHILD) != WS_CHILD) {
- LPPOPUPMENU lpMenu = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
- if (lpMenu != NULL) {
- int oldHeight;
- CopyRect(&rect2, &rect);
- /* Default MenuBar height */
- if (lpMenu->Height == 0) lpMenu->Height = SYSMETRICS_CYMENU + 1;
- oldHeight = lpMenu->Height;
- rect2.bottom = rect2.top + oldHeight;
- StdDrawMenuBar(hdc, &rect2, lpMenu, suppress_menupaint);
- if (oldHeight != lpMenu->Height) {
- printf("NC_DoNCPaint // menubar changed oldHeight=%d != lpMenu->Height=%d\n",
- oldHeight, lpMenu->Height);
- /* Reduce ClientRect according to MenuBar height */
- wndPtr->rectClient.top -= oldHeight;
- wndPtr->rectClient.top += lpMenu->Height;
- }
- GlobalUnlock(wndPtr->wIDmenu);
- }
- }
+ if (HAS_MENU(wndPtr))
+ {
+ LPPOPUPMENU lpMenu = (LPPOPUPMENU) GlobalLock( wndPtr->wIDmenu );
+ RECT r = rect;
+ r.bottom = rect.top + lpMenu->Height;
+ rect.top += lpMenu->Height;
+ StdDrawMenuBar( hdc, &r, lpMenu, suppress_menupaint );
+ GlobalUnlock( wndPtr->wIDmenu );
+ }
if (wndPtr->dwStyle & (WS_VSCROLL | WS_HSCROLL)) {
if ((wndPtr->dwStyle & WS_VSCROLL) && (wndPtr->VScroll != NULL) &&
@@ -624,9 +634,6 @@
bottom -= SYSMETRICS_CYHSCROLL;
SetRect(&rect2, rect.right - SYSMETRICS_CXVSCROLL,
rect.top, rect.right, bottom);
- if (wndPtr->dwStyle & WS_CAPTION) rect.top += SYSMETRICS_CYSIZE;
- if (wndPtr->wIDmenu != 0 && (wndPtr->dwStyle & WS_CHILD) != WS_CHILD)
- rect2.top += SYSMETRICS_CYMENU + 1;
StdDrawScrollBar(hwnd, hdc, SB_VERT, &rect2, (LPHEADSCROLL)wndPtr->VScroll);
}
if ((wndPtr->dwStyle & WS_HSCROLL) && wndPtr->HScroll != NULL &&