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/controls/menu.c b/controls/menu.c
index 5e3dee5..18ca832 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -11,6 +11,7 @@
#include <stdlib.h>
#include <stdio.h>
#include "windows.h"
+#include "syscolor.h"
#include "sysmetrics.h"
#include "prototypes.h"
#include "menu.h"
@@ -22,6 +23,16 @@
#define SC_SYSMENU SC_SCREENSAVE+2
#define SC_ABOUTWINEDLG SC_SCREENSAVE+3
+ /* Dimension of the menu bitmaps */
+static WORD check_bitmap_width = 0, check_bitmap_height = 0;
+static WORD arrow_bitmap_width = 0, arrow_bitmap_height = 0;
+
+ /* Space between 2 menu bar items */
+#define MENU_BAR_ITEMS_SPACE 16
+
+ /* Height of a separator item */
+#define SEPARATOR_HEIGHT 5
+
extern HINSTANCE hSysRes;
HMENU hSysMenu = 0;
HBITMAP hStdCheck = 0;
@@ -45,13 +56,11 @@
LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet);
BOOL ActivateMenuBarFocus(HWND hWnd);
BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu);
-void PopupMenuCalcSize(HWND hwnd);
-void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop);
LPMENUITEM FindMenuItem(HMENU hMenu, WORD nPos, WORD wFlags);
LPMENUITEM GetMenuItemPtr(LPPOPUPMENU menu, WORD nPos);
WORD GetSelectionKey(LPSTR str);
LPSTR GetShortCutString(LPSTR str);
-WORD GetShortCutPos(LPSTR str);
+int GetShortCutPos(LPSTR str);
BOOL HideAllSubPopupMenu(LPPOPUPMENU menu);
void InitStdBitmaps();
HMENU CopySysMenu();
@@ -60,10 +69,287 @@
BOOL FAR PASCAL AboutWine_Proc(HWND hDlg, WORD msg, WORD wParam, LONG lParam);
+
+/***********************************************************************
+ * MENU_CalcItemSize
+ *
+ * Calculate the size of the menu item and store it in lpitem->rect.
+ */
+static void MENU_CalcItemSize( HDC hdc, LPMENUITEM lpitem,
+ int orgX, int orgY, BOOL menuBar )
+{
+ DWORD dwSize;
+ SetRect( &lpitem->rect, orgX, orgY, orgX, orgY );
+
+ if (lpitem->item_flags & MF_SEPARATOR)
+ {
+ lpitem->rect.bottom += SEPARATOR_HEIGHT;
+ return;
+ }
+
+ if (!menuBar) lpitem->rect.right += check_bitmap_width+arrow_bitmap_width;
+
+ if (lpitem->item_flags & MF_BITMAP)
+ {
+ BITMAP bm;
+ HBITMAP hbitmap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bm);
+ lpitem->rect.right += bm.bmWidth;
+ lpitem->rect.bottom += bm.bmHeight;
+ return;
+ }
+
+ /* If we get here, then it is a text item */
+
+ if (menuBar) lpitem->rect.right += MENU_BAR_ITEMS_SPACE;
+ dwSize = GetTextExtent( hdc, lpitem->item_text, strlen(lpitem->item_text));
+ lpitem->rect.right += LOWORD(dwSize);
+ lpitem->rect.bottom += max( HIWORD(dwSize), SYSMETRICS_CYMENU );
+}
+
+
+/***********************************************************************
+ * MENU_PopupMenuCalcSize
+ *
+ * Calculate the size of a popup menu.
+ */
+static void MENU_PopupMenuCalcSize( HWND hwnd )
+{
+ LPPOPUPMENU lppop;
+ LPMENUITEM lpitem, lpitemStart, lptmp;
+ WND *wndPtr;
+ HDC hdc;
+ int orgX, orgY, maxX;
+
+ if (!(lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr))) return;
+ SetRect( &lppop->rect, 0, 0, 0, 0 );
+ lppop->Width = lppop->Height = 0;
+ if (lppop->nItems == 0) return;
+ hdc = GetDC( hwnd );
+ maxX = 0;
+ lpitemStart = lppop->firstItem;
+ while (lpitemStart != NULL)
+ {
+ orgX = maxX;
+ orgY = 0;
+
+ /* Parse items until column break or end of menu */
+ for (lpitem = lpitemStart; lpitem != NULL; lpitem = lpitem->next)
+ {
+ if ((lpitem != lpitemStart) &&
+ (lpitem->item_flags & (MF_MENUBREAK | MF_MENUBARBREAK))) break;
+ MENU_CalcItemSize( hdc, lpitem, orgX, orgY, FALSE );
+ maxX = max( maxX, lpitem->rect.right );
+ orgY = lpitem->rect.bottom;
+ }
+
+ /* Finish the column (set all items to the largest width found) */
+ for (lptmp = lpitemStart; lptmp != lpitem; lptmp = lptmp->next)
+ {
+ lptmp->rect.right = maxX;
+ }
+
+ /* And go to the next column */
+ lppop->Height = max( lppop->Height, orgY );
+ lpitemStart = lpitem;
+ }
+
+ lppop->Width = maxX;
+ SetRect( &lppop->rect, 0, 0, lppop->Width, lppop->Height );
+ ReleaseDC( hwnd, hdc );
+}
+
+
+/***********************************************************************
+ * MENU_MenuBarCalcSize
+ *
+ * Calculate the size of the menu bar.
+ */
+static void MENU_MenuBarCalcSize( HDC hdc, LPRECT lprect, LPPOPUPMENU lppop )
+{
+ LPMENUITEM lpitem, lpitemStart, lptmp;
+ int orgX, orgY, maxY;
+
+ if ((lprect == NULL) || (lppop == NULL)) return;
+ if (lppop->nItems == 0) return;
+#ifdef DEBUG_MENUCALC
+ printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n",
+ lprect->left, lprect->top, lprect->right, lprect->bottom);
+#endif
+ lppop->Width = lprect->right - lprect->left;
+ lppop->Height = 0;
+ maxY = lprect->top;
+
+ lpitemStart = lppop->firstItem;
+ while (lpitemStart != NULL)
+ {
+ orgX = lprect->left;
+ orgY = maxY;
+
+ /* Parse items until line break or end of menu */
+ for (lpitem = lpitemStart; lpitem != NULL; lpitem = lpitem->next)
+ {
+ if ((lpitem != lpitemStart) &&
+ (lpitem->item_flags & (MF_MENUBREAK | MF_MENUBARBREAK))) break;
+ MENU_CalcItemSize( hdc, lpitem, orgX, orgY, TRUE );
+ if (lpitem->rect.right > lprect->right)
+ {
+ if (lpitem != lpitemStart) break;
+ else lpitem->rect.right = lprect->right;
+ }
+ maxY = max( maxY, lpitem->rect.bottom );
+ orgX = lpitem->rect.right;
+ }
+
+ /* Finish the line (set all items to the largest height found) */
+ for (lptmp = lpitemStart; lptmp != lpitem; lptmp = lptmp->next)
+ {
+ lptmp->rect.bottom = maxY;
+ }
+
+ /* And go to the next line */
+ lpitemStart = lpitem;
+ }
+
+ lprect->bottom = maxY;
+ lppop->Height = lprect->bottom - lprect->top;
+ CopyRect( &lppop->rect, lprect );
+}
+
+
+/***********************************************************************
+ * MENU_DrawMenuItem
+ *
+ * Draw a single menu item.
+ */
+static void MENU_DrawMenuItem( HDC hdc, LPMENUITEM lpitem,
+ LPRECT menuRect, BOOL menuBar )
+{
+ RECT rect;
+
+ if (menuBar && (lpitem->item_flags & MF_SEPARATOR)) return;
+ rect = lpitem->rect;
+
+ /* Draw the background */
+
+ if (lpitem->item_flags & MF_HILITE)
+ FillRect( hdc, &rect, sysColorObjects.hbrushHighlight );
+ else FillRect( hdc, &rect, sysColorObjects.hbrushMenu );
+ SetBkMode( hdc, TRANSPARENT );
+
+ /* Draw the separator bar (if any) */
+
+ if (!menuBar && (lpitem->item_flags & MF_MENUBARBREAK))
+ {
+ SelectObject( hdc, sysColorObjects.hpenWindowFrame );
+ MoveTo( hdc, rect.left, menuRect->top );
+ LineTo( hdc, rect.left, menuRect->bottom );
+ }
+ if (lpitem->item_flags & MF_SEPARATOR)
+ {
+ SelectObject( hdc, sysColorObjects.hpenWindowFrame );
+ MoveTo( hdc, rect.left, rect.top + SEPARATOR_HEIGHT/2 );
+ LineTo( hdc, rect.right, rect.top + SEPARATOR_HEIGHT/2 );
+ }
+
+ if (!menuBar)
+ {
+ /* Draw the check mark */
+
+ if (lpitem->item_flags & MF_CHECKED)
+ {
+ HDC hMemDC = CreateCompatibleDC( hdc );
+ if (lpitem->hCheckBit == 0) SelectObject(hMemDC, hStdCheck);
+ else SelectObject(hMemDC, lpitem->hCheckBit);
+ BitBlt( hdc, rect.left,
+ (rect.top + rect.bottom - check_bitmap_height) / 2,
+ check_bitmap_width, check_bitmap_height,
+ hMemDC, 0, 0, SRCCOPY );
+ DeleteDC( hMemDC );
+ }
+ else /* Not checked */
+ {
+ if (lpitem->hUnCheckBit != 0)
+ {
+ HDC hMemDC = CreateCompatibleDC( hdc );
+ SelectObject(hMemDC, lpitem->hUnCheckBit);
+ BitBlt( hdc, rect.left,
+ (rect.top + rect.bottom - check_bitmap_height) / 2,
+ check_bitmap_width, check_bitmap_height,
+ hMemDC, 0, 0, SRCCOPY );
+ DeleteDC( hMemDC );
+ }
+ }
+
+ /* Draw the popup-menu arrow */
+
+ if (lpitem->item_flags & MF_POPUP)
+ {
+ HDC hMemDC = CreateCompatibleDC( hdc );
+ SelectObject(hMemDC, hStdMnArrow);
+ BitBlt( hdc, rect.right-arrow_bitmap_width,
+ (rect.top + rect.bottom - arrow_bitmap_height) / 2,
+ arrow_bitmap_width, arrow_bitmap_height,
+ hMemDC, 0, 0, SRCCOPY );
+ DeleteDC(hMemDC);
+ }
+
+ rect.left += check_bitmap_width;
+ rect.right -= arrow_bitmap_width;
+ }
+
+ /* Setup colors */
+
+ if (lpitem->item_flags & MF_HILITE)
+ {
+ SetTextColor( hdc, GetSysColor( COLOR_HIGHLIGHTTEXT ) );
+ SetBkColor( hdc, GetSysColor( COLOR_HIGHLIGHT ) );
+ }
+ else
+ {
+ if (lpitem->item_flags & MF_GRAYED)
+ SetTextColor( hdc, GetSysColor( COLOR_GRAYTEXT ) );
+ else
+ SetTextColor( hdc, GetSysColor( COLOR_MENUTEXT ) );
+ SetBkColor( hdc, GetSysColor( COLOR_MENU ) );
+ }
+
+ /* Draw the item text or bitmap */
+
+ if (lpitem->item_flags & MF_BITMAP)
+ {
+ HBITMAP hbitmap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
+ HDC hMemDC = CreateCompatibleDC( hdc );
+ SelectObject( hMemDC, hbitmap );
+ BitBlt( hdc, rect.left, rect.top,
+ rect.right-rect.left, rect.bottom-rect.top,
+ hMemDC, 0, 0, SRCCOPY );
+ DeleteDC( hMemDC );
+ return;
+ }
+ else /* No bitmap */
+ {
+ int x = GetShortCutPos(lpitem->item_text);
+ if (menuBar)
+ {
+ rect.left += MENU_BAR_ITEMS_SPACE / 2;
+ rect.right -= MENU_BAR_ITEMS_SPACE / 2;
+ }
+ if (x != -1)
+ {
+ DrawText( hdc, lpitem->item_text, x, &rect,
+ DT_LEFT | DT_VCENTER | DT_SINGLELINE );
+ DrawText( hdc, lpitem->item_text + x, -1, &rect,
+ DT_RIGHT | DT_VCENTER | DT_SINGLELINE );
+ }
+ else DrawText( hdc, lpitem->item_text, -1, &rect,
+ DT_LEFT | DT_VCENTER | DT_SINGLELINE );
+ }
+}
+
+
/***********************************************************************
* PopupMenuWndProc
- SetWindow
- SetWindow
*/
LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam )
{
@@ -148,19 +434,6 @@
break;
}
lppop->FocusedItem = (WORD)-1;
- if (!lppop->BarFlag) {
- PopupMenuCalcSize(hwnd);
-/* ResetHiliteFlags(lppop); */
-#ifdef DEBUG_MENU
- printf("PopupMenuWndProc hWnd=%04X WM_SHOWWINDOW Width=%d Height=%d !\n",
- hwnd, lppop->Width, lppop->Height);
-#endif
- SetWindowPos(hwnd, 0, 0, 0, lppop->Width + 2, lppop->Height,
- SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE );
-#ifdef DEBUG_MENU
- printf("PopupMenuWndProc // End of WM_SHOWWINDOW !\n");
-#endif
- }
break;
case WM_LBUTTONDOWN:
lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
@@ -335,12 +608,7 @@
#ifdef DEBUG_MENU
printf("PopupMenuWndProc // WM_PAINT received !\n");
#endif
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (lppop == NULL) break;
- if (!lppop->BarFlag) {
- PopupMenuCalcSize(hwnd);
- StdDrawPopupMenu(hwnd);
- }
+ StdDrawPopupMenu(hwnd);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
@@ -365,7 +633,7 @@
GetClientRect(hWnd, &rect);
if (lppop->BarFlag) {
GetWindowRect(hWnd, &rect);
- y = rect.top + lppop->rect.bottom;
+ y = rect.top + lpitem->rect.bottom;
TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
rect.left + lpitem->rect.left,
y, 0, lppop->ownerWnd, (LPRECT)NULL);
@@ -432,7 +700,7 @@
lppop2->hWndParent = hWnd;
if (lppop->BarFlag) {
GetWindowRect(hWnd, &rect);
- y = rect.top + lppop->rect.bottom;
+ y = rect.top + lpitem->rect.bottom;
ReleaseCapture();
if (MenuHasFocus) {
TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
@@ -551,7 +819,7 @@
{
lppop2->hWndParent = hWnd;
GetWindowRect(hWnd, &rect);
- rect.top += lppop->rect.bottom;
+ rect.top += lpitem->rect.bottom;
TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON,
rect.left + lpitem->rect.left, rect.top,
0, lppop->ownerWnd, (LPRECT)NULL);
@@ -581,7 +849,7 @@
nIndex--;
lpitem = GetMenuItemPtr(lppop, nIndex);
}
- while (lpitem != NULL && lpitem->item_flags & MF_HILITE) {
+ while (lpitem != NULL && lpitem->item_flags & MF_SEPARATOR) {
nIndex--;
lpitem = GetMenuItemPtr(lppop, nIndex);
}
@@ -622,63 +890,46 @@
lpitem = lppop->firstItem;
for(i = 0; i < lppop->nItems; i++) {
if (lpitem == NULL) return;
- lpitem->item_flags &= 0xFFFF ^ MF_HILITE;
+ lpitem->item_flags &= ~MF_HILITE;
lpitem = (LPMENUITEM)lpitem->next;
}
}
-void MenuItemSelect0(HWND hWnd, LPPOPUPMENU lppop,
- LPMENUITEM lpitem, WORD wIndex)
-{
- LPMENUITEM lpprev;
-
- if (lppop == NULL)
- return;
- if (lppop->FocusedItem != (WORD)-1)
- {
- lpprev = GetMenuItemPtr(lppop, lppop->FocusedItem);
- if (lpprev != NULL)
- {
- lpprev->item_flags &= MF_HILITE ^ 0xFFFF;
- if ((lpprev->item_flags & MF_POPUP) == MF_POPUP)
- HideAllSubPopupMenu(lppop);
- if (lppop->BarFlag)
- DrawMenuBar(hWnd);
- else
- {
- InvalidateRect(hWnd, &lpprev->rect, TRUE);
- UpdateWindow(hWnd);
- }
- }
- }
- lppop->FocusedItem = wIndex;
- if (lpitem == NULL || wIndex == (WORD)-1)
- {
- ResetHiliteFlags(lppop);
- if (lppop->BarFlag) DrawMenuBar(hWnd);
- }
- else
- {
- lpitem->item_flags |= MF_HILITE;
- if (lppop->BarFlag)
- DrawMenuBar(hWnd);
- else
- {
- InvalidateRect(hWnd, &lpitem->rect, TRUE);
- UpdateWindow(hWnd);
- }
- SendMessage(hWnd, WM_MENUSELECT, lpitem->item_id,
- MAKELONG(0, lpitem->item_flags));
- }
-}
-
-
void MenuItemSelect(HWND hWnd, LPPOPUPMENU lppop, WORD wIndex)
{
- LPMENUITEM lpitem;
- lpitem = GetMenuItemPtr(lppop, wIndex);
- MenuItemSelect0(hWnd, lppop, lpitem, wIndex);
+ LPMENUITEM lpitem;
+ HDC hdc;
+
+ if (lppop == NULL) return;
+ if (lppop->BarFlag) hdc = GetDCEx( hWnd, 0, DCX_CACHE | DCX_WINDOW );
+ else hdc = GetDC( hWnd );
+
+ /* Clear previous highlighted item */
+ if (lppop->FocusedItem != (WORD)-1)
+ {
+ if ((lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem)) != NULL)
+ {
+ lpitem->item_flags &= ~MF_HILITE;
+ if ((lpitem->item_flags & MF_POPUP) == MF_POPUP)
+ HideAllSubPopupMenu(lppop);
+ MENU_DrawMenuItem( hdc, lpitem, &lppop->rect, lppop->BarFlag );
+ }
+ }
+
+ /* Highlight new item (if any) */
+ lppop->FocusedItem = wIndex;
+ if (lppop->FocusedItem != (WORD)-1)
+ {
+ if ((lpitem = GetMenuItemPtr(lppop, lppop->FocusedItem)) != NULL)
+ {
+ lpitem->item_flags |= MF_HILITE;
+ MENU_DrawMenuItem( hdc, lpitem, &lppop->rect, lppop->BarFlag );
+ SendMessage(hWnd, WM_MENUSELECT, lpitem->item_id,
+ MAKELONG(0, lpitem->item_flags));
+ }
+ }
+ ReleaseDC( hWnd, hdc );
}
@@ -728,249 +979,47 @@
void StdDrawPopupMenu(HWND hwnd)
{
- WND *wndPtr;
+ WND *wndPtr;
LPPOPUPMENU lppop;
- LPMENUITEM lpitem;
+ LPMENUITEM lpitem;
PAINTSTRUCT ps;
- HBRUSH hBrush;
- HPEN hOldPen;
- HWND hWndParent;
- HDC hDC, hMemDC;
- RECT rect, rect2, rect3;
- DWORD OldTextColor;
- int OldBkMode;
- HFONT hOldFont;
- HBITMAP hBitMap;
- BITMAP bm;
- UINT i, x;
+ RECT rect;
+ HDC hDC;
+
hDC = BeginPaint(hwnd, &ps);
- if (!IsWindowVisible(hwnd)) {
- EndPaint(hwnd, &ps);
- return;
- }
- InitStdBitmaps();
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (lppop == NULL) goto EndOfPaint;
- hBrush = GetStockObject(WHITE_BRUSH);
GetClientRect(hwnd, &rect);
- GetClientRect(hwnd, &rect2);
- FillRect(hDC, &rect, hBrush);
- FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
- if (lppop->nItems == 0) goto EndOfPaint;
- lpitem = lppop->firstItem;
- if (lpitem == NULL) goto EndOfPaint;
- for(i = 0; i < lppop->nItems; i++) {
- CopyRect(&rect2, &lpitem->rect);
- if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
- hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
- MoveTo(hDC, rect2.left, rect2.top + 1);
- LineTo(hDC, rect2.right, rect2.top + 1);
- SelectObject(hDC, hOldPen);
- }
- if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
- hMemDC = CreateCompatibleDC(hDC);
- if (lpitem->hCheckBit == 0) {
- SelectObject(hMemDC, hStdCheck);
- GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
- }
- else {
- SelectObject(hMemDC, lpitem->hCheckBit);
- GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- }
- BitBlt(hDC, rect2.left, rect2.top + 1,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
- else {
- if (lpitem->hUnCheckBit != 0) {
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, lpitem->hUnCheckBit);
- GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- BitBlt(hDC, rect2.left, rect2.top + 1,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
- }
- if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
- rect2.left += lppop->CheckWidth;
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, hBitMap);
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
-#ifdef DEBUG_MENU
- printf("StdDrawPopupMenu // MF_BITMAP hBit=%04X w=%d h=%d\n",
- hBitMap, bm.bmWidth, bm.bmHeight);
-#endif
- BitBlt(hDC, rect2.left, rect2.top,
- bm.bmWidth, bm.bmHeight,
- hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
- InvertRect(hDC, &lpitem->rect);
- }
- if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
- ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
- OldBkMode = SetBkMode(hDC, TRANSPARENT);
- if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
- OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
- else {
- if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
- OldTextColor = SetTextColor(hDC, 0x00FFFFFFL);
- else
- OldTextColor = SetTextColor(hDC, 0x00000000L);
- }
- CopyRect(&rect3, &lpitem->rect);
- if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
- FillRect(hDC, &rect3, GetStockObject(BLACK_BRUSH));
- InflateRect(&rect3, 0, -2);
- rect3.left += lppop->CheckWidth;
- hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
- if ((x = GetShortCutPos(lpitem->item_text)) != (WORD)-1) {
- DrawText(hDC, lpitem->item_text, x, &rect3,
- DT_LEFT | DT_VCENTER | DT_SINGLELINE);
- DrawText(hDC, &lpitem->item_text[x], -1, &rect3,
- DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
- }
- else
- DrawText(hDC, lpitem->item_text, -1, &rect3,
- DT_LEFT | DT_VCENTER | DT_SINGLELINE);
- SelectObject(hDC, hOldPen);
- SetTextColor(hDC, OldTextColor);
- SetBkMode(hDC, OldBkMode);
- SelectObject(hDC, hOldFont);
- CopyRect(&rect2, &lpitem->rect);
- }
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- CopyRect(&rect3, &lpitem->rect);
- rect3.left = rect3.right - lppop->PopWidth;
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, hStdMnArrow);
- GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
- BitBlt(hDC, rect3.left, rect3.top + 1,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
- if (lpitem->next == NULL) goto EndOfPaint;
- lpitem = (LPMENUITEM)lpitem->next;
+ FillRect(hDC, &rect, sysColorObjects.hbrushMenu );
+
+ lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
+ for (lpitem = lppop->firstItem; lpitem != NULL; lpitem = lpitem->next )
+ {
+ MENU_DrawMenuItem( hDC, lpitem, &rect, FALSE );
}
-EndOfPaint:
EndPaint( hwnd, &ps );
}
-
void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop,
BOOL suppress_draw)
{
LPMENUITEM lpitem;
- HBRUSH hBrush;
- HPEN hOldPen;
- HDC hMemDC;
- RECT rect, rect2, rect3;
- HFONT hOldFont;
- DWORD OldTextColor;
- int OldBkMode;
- HBITMAP hBitMap;
- BITMAP bm;
- UINT i, textwidth;
if (lppop == NULL || lprect == NULL) return;
#ifdef DEBUG_MENU
printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop);
#endif
- MenuBarCalcSize(hDC, lprect, lppop);
+ if (lppop->Height == 0) MENU_MenuBarCalcSize(hDC, lprect, lppop);
if (suppress_draw) return;
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
- hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN));
- hBrush = GetStockObject(WHITE_BRUSH);
- CopyRect(&rect, lprect);
- FillRect(hDC, &rect, hBrush);
- FrameRect(hDC, &rect, GetStockObject(BLACK_BRUSH));
- if (lppop->nItems == 0) goto EndOfPaint;
- lpitem = lppop->firstItem;
- if (lpitem == NULL) goto EndOfPaint;
- for(i = 0; i < lppop->nItems; i++) {
- CopyRect(&rect2, &lpitem->rect);
-#ifdef DEBUG_MENU
- printf("StdDrawMenuBar // start left=%d\n", rect2.left);
-#endif
- if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
- hMemDC = CreateCompatibleDC(hDC);
- if (lpitem->hCheckBit == 0) {
- SelectObject(hMemDC, hStdCheck);
- GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
- }
- else {
- SelectObject(hMemDC, lpitem->hCheckBit);
- GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- }
- BitBlt(hDC, rect2.left, rect2.top + 1,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- rect2.left += bm.bmWidth;
-#ifdef DEBUG_MENU
- printf("StdDrawMenuBar // MF_CHECKED bm.bmWidth=%d\n", bm.bmWidth);
-#endif
- DeleteDC(hMemDC);
- }
- else {
- if (lpitem->hUnCheckBit != 0) {
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, lpitem->hUnCheckBit);
- GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- BitBlt(hDC, rect2.left, rect2.top + 1,
- bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
- rect2.left += bm.bmWidth;
-#ifdef DEBUG_MENU
- printf("StdDrawMenuBar // MF_UNCHECKED bm.bmWidth=%d\n", bm.bmWidth);
-#endif
- DeleteDC(hMemDC);
- }
- }
- if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
- hMemDC = CreateCompatibleDC(hDC);
- SelectObject(hMemDC, hBitMap);
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
-#ifdef DEBUG_MENU
- printf("StdDrawMenuBar // MF_BITMAP hBit=%04X w=%d h=%d\n",
- hBitMap, bm.bmWidth, bm.bmHeight);
-#endif
- BitBlt(hDC, rect2.left, rect2.top,
- bm.bmWidth, bm.bmHeight,
- hMemDC, 0, 0, SRCCOPY);
- DeleteDC(hMemDC);
- }
- if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
- ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
- OldBkMode = SetBkMode(hDC, TRANSPARENT);
- if ((lpitem->item_flags & MF_DISABLED) == MF_DISABLED)
- OldTextColor = SetTextColor(hDC, 0x00C0C0C0L);
- else {
- if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
- OldTextColor = SetTextColor(hDC, 0x00FFFFFFL);
- else
- OldTextColor = SetTextColor(hDC, 0x00000000L);
- }
- if ((lpitem->item_flags & MF_HILITE) == MF_HILITE)
- FillRect(hDC, &rect2, GetStockObject(BLACK_BRUSH));
-#ifdef DEBUG_MENU
- printf("StdDrawMenuBar // rect2.left=%d\n", rect2.left);
-#endif
- DrawText(hDC, lpitem->item_text, -1, &rect2,
- DT_LEFT | DT_VCENTER | DT_SINGLELINE);
- SetTextColor(hDC, OldTextColor);
- SetBkMode(hDC, OldBkMode);
- SelectObject(hDC, hOldFont);
- }
- if (lpitem->next == NULL) goto EndOfPaint;
- lpitem = (LPMENUITEM)lpitem->next;
- }
-EndOfPaint:
- SelectObject(hDC, hOldPen);
- SelectObject(hDC, hOldFont);
+
+ FillRect(hDC, lprect, sysColorObjects.hbrushMenu );
+ SelectObject( hDC, sysColorObjects.hpenWindowFrame );
+ MoveTo( hDC, lprect->left, lprect->bottom );
+ LineTo( hDC, lprect->right, lprect->bottom );
+
+ if (lppop->nItems == 0) return;
+ for (lpitem = lppop->firstItem; lpitem != NULL; lpitem = lpitem->next )
+ {
+ MENU_DrawMenuItem( hDC, lpitem, lprect, TRUE );
+ }
}
@@ -1025,188 +1074,16 @@
}
-void PopupMenuCalcSize(HWND hwnd)
-{
- WND *wndPtr;
- LPPOPUPMENU lppop;
- LPMENUITEM lpitem;
- HDC hDC;
- RECT rect;
- HBITMAP hBitMap;
- BITMAP bm;
- HFONT hOldFont;
- UINT i, OldWidth, TempWidth;
- DWORD dwRet;
-#ifdef DEBUG_MENUCALC
- printf("PopupMenuCalcSize hWnd=%04X !\n", hWnd);
-#endif
- InitStdBitmaps();
- lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr);
- if (lppop == NULL) return;
- if (lppop->nItems == 0) return;
- hDC = GetDC(hwnd);
- lppop->Width = 20;
- lppop->CheckWidth = lppop->PopWidth = 0;
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
-CalcAGAIN:
- OldWidth = lppop->Width;
- SetRect(&rect, 1, 1, OldWidth, 0);
- lpitem = lppop->firstItem;
- for(i = 0; i < lppop->nItems; i++) {
- if (lpitem == NULL) break;
-#ifdef DEBUG_MENUCALC
- printf("PopupMenuCalcSize item #%d !\n", i);
-#endif
- rect.right = rect.left + lppop->Width;
- if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
- if (lpitem->hCheckBit != 0)
- GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- else
- GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
- lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
- }
- else {
- if (lpitem->hUnCheckBit != 0) {
- GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- lppop->CheckWidth = max(lppop->CheckWidth, bm.bmWidth);
- }
- }
- if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) {
- GetObject(hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm);
- lppop->PopWidth = max(lppop->PopWidth, bm.bmWidth);
- }
- if ((lpitem->item_flags & MF_SEPARATOR) == MF_SEPARATOR) {
- rect.bottom = rect.top + 3;
- }
- if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
- rect.bottom = rect.top + bm.bmHeight;
- lppop->Width = max(lppop->Width, bm.bmWidth);
- }
- if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
- ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- dwRet = GetTextExtent(hDC, (char *)lpitem->item_text,
- strlen((char *)lpitem->item_text));
- rect.bottom = rect.top + HIWORD(dwRet);
- InflateRect(&rect, 0, 2);
- TempWidth = LOWORD(dwRet);
- if (GetShortCutPos(lpitem->item_text) != (WORD)-1)
- TempWidth += 15;
- TempWidth += lppop->CheckWidth;
- TempWidth += lppop->PopWidth;
- lppop->Width = max(lppop->Width, TempWidth);
- }
- CopyRect(&lpitem->rect, &rect);
- rect.top = rect.bottom;
- lpitem = (LPMENUITEM)lpitem->next;
- }
- if (OldWidth < lppop->Width) goto CalcAGAIN;
- lppop->Height = rect.bottom;
- SetRect(&lppop->rect, 1, 1, lppop->Width, lppop->Height);
-#ifdef DEBUG_MENUCALC
- printf("PopupMenuCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
-#endif
- SelectObject(hDC, hOldFont);
- ReleaseDC(hwnd, hDC);
-}
-void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop)
-{
- LPMENUITEM lpitem;
- LPMENUITEM lpitem2;
- RECT rect;
- HBITMAP hBitMap;
- BITMAP bm;
- HFONT hOldFont;
- UINT i, j;
- UINT OldHeight, LineHeight;
- DWORD dwRet;
- if (lprect == NULL) return;
- if (lppop == NULL) return;
- if (lppop->nItems == 0) return;
- InitStdBitmaps();
-#ifdef DEBUG_MENUCALC
- printf("MenuBarCalcSize left=%d top=%d right=%d bottom=%d !\n",
- lprect->left, lprect->top, lprect->right, lprect->bottom);
-#endif
- hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT));
- lppop->CheckWidth = 0;
- LineHeight = OldHeight = SYSMETRICS_CYMENU + 1;
- SetRect(&rect, lprect->left, lprect->top, 0, lprect->top + LineHeight);
- lpitem2 = lppop->firstItem;
- while (lpitem != NULL) {
- lpitem = lpitem2;
- while(rect.right < lprect->right) {
- if (lpitem == NULL) break;
- rect.right = rect.left;
- if ((lpitem->item_flags & MF_BITMAP) == MF_BITMAP) {
- hBitMap = (HBITMAP)LOWORD((LONG)lpitem->item_text);
- GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm);
- rect.right = rect.left + bm.bmWidth;
- LineHeight = max(LineHeight, bm.bmHeight);
- }
- if (((lpitem->item_flags & MF_BITMAP) != MF_BITMAP) &&
- ((lpitem->item_flags & MF_SEPARATOR) != MF_SEPARATOR) &&
- ((lpitem->item_flags & MF_MENUBREAK) != MF_MENUBREAK)) {
- dwRet = GetTextExtent(hDC, (char *)lpitem->item_text,
- strlen((char *)lpitem->item_text));
- rect.right = rect.left + LOWORD(dwRet) + 10;
- dwRet = max(SYSMETRICS_CYMENU, (HIWORD(dwRet) + 6));
- LineHeight = max(LineHeight, (WORD)dwRet);
- }
- if ((lpitem->item_flags & MF_CHECKED) == MF_CHECKED) {
- if (lpitem->hCheckBit != 0)
- GetObject(lpitem->hCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- else
- GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
- rect.right += bm.bmWidth;
- LineHeight = max(LineHeight, bm.bmHeight);
- }
- else {
- if (lpitem->hUnCheckBit != 0) {
- GetObject(lpitem->hUnCheckBit, sizeof(BITMAP), (LPSTR)&bm);
- rect.right += bm.bmWidth;
- LineHeight = max(LineHeight, bm.bmHeight);
- }
- }
- CopyRect(&lpitem->rect, &rect);
- rect.left = rect.right;
- lpitem = (LPMENUITEM)lpitem->next;
- }
- if (LineHeight == OldHeight) {
- lpitem2 = lpitem;
- LineHeight = OldHeight = SYSMETRICS_CYMENU + 1;
- if (lpitem != NULL)
- SetRect(&rect, lprect->left, rect.bottom,
- 0, rect.bottom + LineHeight);
- }
- else {
- OldHeight = LineHeight;
- SetRect(&rect, lprect->left, rect.top, 0, rect.top + LineHeight);
- }
- }
- lppop->Width = lprect->right - lprect->left;
- lppop->Height = rect.bottom - lprect->top;
- lprect->bottom = lprect->top + lppop->Height;
- CopyRect(&lppop->rect, lprect);
-#ifdef DEBUG_MENUCALC
- printf("MenuBarCalcSize w=%d h=%d !\n", lppop->Width, lppop->Height);
-#endif
- SelectObject(hDC, hOldFont);
-}
-
-
/***********************************************************************
* MENU_GetMenuBarHeight
*
* Compute the size of the menu bar height. Used by NC_HandleNCCalcSize().
*/
-WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth )
+WORD MENU_GetMenuBarHeight( HWND hwnd, WORD menubarWidth, int orgX, int orgY )
{
HDC hdc;
RECT rectBar;
@@ -1216,8 +1093,8 @@
if (!(lppop = PopupMenuGetWindowAndStorage( hwnd, &wndPtr ))) return 0;
if (!wndPtr) return 0;
hdc = GetDC( hwnd );
- SetRect( &rectBar, 0, 0, menubarWidth, SYSMETRICS_CYMENU );
- MenuBarCalcSize( hdc, &rectBar, lppop );
+ SetRect( &rectBar, orgX, orgY, orgX+menubarWidth, orgY+SYSMETRICS_CYMENU );
+ MENU_MenuBarCalcSize( hdc, &rectBar, lppop );
ReleaseDC( hwnd, hdc );
printf( "MENU_GetMenuBarHeight: returning %d\n", lppop->Height );
return lppop->Height;
@@ -1311,7 +1188,7 @@
-WORD GetShortCutPos(LPSTR str)
+int GetShortCutPos(LPSTR str)
{
int i;
for (i = 0; i < strlen(str); i++) {
@@ -1407,22 +1284,26 @@
*/
BOOL EnableMenuItem(HMENU hMenu, WORD wItemID, WORD wFlags)
{
- LPMENUITEM lpitem;
+ LPMENUITEM lpitem;
#ifdef DEBUG_MENU
- printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
+ printf("EnableMenuItem (%04X, %04X, %04X) !\n", hMenu, wItemID, wFlags);
#endif
- lpitem = FindMenuItem(hMenu, wItemID, wFlags);
- if (lpitem != NULL) {
- if (wFlags && MF_DISABLED)
- lpitem->item_flags |= MF_DISABLED;
- else
- lpitem->item_flags &= ((WORD)-1 ^ MF_DISABLED);
-#ifdef DEBUG_MENU
- printf("EnableMenuItem // Found !\n");
-#endif
- return(TRUE);
- }
- return FALSE;
+ if (!(lpitem = FindMenuItem(hMenu, wItemID, wFlags))) return FALSE;
+
+ /* We can't have MF_GRAYED and MF_DISABLED together */
+ if (wFlags & MF_GRAYED)
+ {
+ lpitem->item_flags = (lpitem->item_flags & ~MF_DISABLED) | MF_GRAYED;
+ }
+ else if (wFlags & MF_DISABLED)
+ {
+ lpitem->item_flags = (lpitem->item_flags & ~MF_GRAYED) | MF_DISABLED;
+ }
+ else /* MF_ENABLED */
+ {
+ lpitem->item_flags &= ~(MF_GRAYED | MF_DISABLED);
+ }
+ return TRUE;
}
@@ -1858,7 +1739,8 @@
lppop->ownerWnd = hWnd;
lppop->hWndPrev = GetFocus();
if (lppop->hWnd == (HWND)NULL) {
- lppop->hWnd = CreateWindow("POPUPMENU", "", WS_POPUP | WS_VISIBLE,
+ lppop->hWnd = CreateWindow(POPUPMENU_CLASS_NAME, "",
+ WS_POPUP | WS_BORDER,
x, y, lppop->Width, lppop->Height, (HWND)NULL, 0,
wndPtr->hInstance, (LPSTR)lppop);
if (lppop->hWnd == 0) {
@@ -1866,18 +1748,16 @@
return FALSE;
}
}
- else {
- ShowWindow(lppop->hWnd, SW_SHOWNOACTIVATE);
- }
if (!lppop->BarFlag) {
- PopupMenuCalcSize(lppop->hWnd);
+ MENU_PopupMenuCalcSize(lppop->hWnd);
#ifdef DEBUG_MENU
printf("TrackPopupMenu // x=%d y=%d Width=%d Height=%d\n",
x, y, lppop->Width, lppop->Height);
#endif
- SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height,
+ SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height + 2,
SWP_NOACTIVATE | SWP_NOZORDER);
}
+ ShowWindow(lppop->hWnd, SW_SHOWNOACTIVATE);
SetFocus(lppop->hWnd);
if (!MenuHasFocus) {
#ifdef DEBUG_MENU
@@ -2041,10 +1921,8 @@
*/
DWORD GetMenuCheckMarkDimensions()
{
- BITMAP bm;
- InitStdBitmaps();
- GetObject(hStdCheck, sizeof(BITMAP), (LPSTR)&bm);
- return MAKELONG(bm.bmWidth, bm.bmHeight);
+ InitStdBitmaps();
+ return MAKELONG( check_bitmap_width, check_bitmap_height );
}
@@ -2230,27 +2108,21 @@
printf("SetMenu(%04X, %04X);\n", hWnd, hMenu);
#endif
if (GetCapture() == hWnd) ReleaseCapture();
- if (wndPtr->window != 0) {
- flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED;
-/* if (!IsWindowVisible(hWnd)) flags |= SWP_NOREDRAW; */
- flags |= SWP_NOREDRAW;
- if (hMenu == 0) {
- wndPtr->wIDmenu = hMenu;
- printf("SetMenu(%04X, %04X) // Menu removed, need NC recalc!\n", hWnd, hMenu);
- SetWindowPos(hWnd, 0, 0, 0, 0, 0, flags);
- return TRUE;
- }
- wndPtr->wIDmenu = hMenu;
- SetWindowPos(hWnd, 0, 0, 0, 0, 0, flags);
- }
- lpmenu = (LPPOPUPMENU) GlobalLock(hMenu);
- if (lpmenu == NULL) {
+ wndPtr->wIDmenu = hMenu;
+ if (hMenu != 0)
+ {
+ lpmenu = (LPPOPUPMENU) GlobalLock(hMenu);
+ if (lpmenu == NULL) {
printf("SetMenu(%04X, %04X) // Bad menu handle !\n", hWnd, hMenu);
return FALSE;
}
- lpmenu->ownerWnd = hWnd;
- ResetHiliteFlags(lpmenu);
- GlobalUnlock(hMenu);
+ lpmenu->ownerWnd = hWnd;
+ lpmenu->Height = 0; /* Make sure we recalculate the size */
+ ResetHiliteFlags(lpmenu);
+ GlobalUnlock(hMenu);
+ }
+ SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
+ SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
return TRUE;
}
@@ -2296,7 +2168,6 @@
{
WND *wndPtr;
LPPOPUPMENU lppop;
- HDC hDC;
#ifdef DEBUG_MENU
printf("DrawMenuBar (%04X)\n", hWnd);
#endif
@@ -2308,27 +2179,12 @@
#endif
lppop = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu);
if (lppop == NULL) return;
- if (lppop->Height != 0) {
- int oldHeight;
- oldHeight = lppop->Height;
- hDC = GetWindowDC(hWnd);
- StdDrawMenuBar(hDC, &lppop->rect, lppop, TRUE);
- ReleaseDC(hWnd, hDC);
- if (oldHeight != lppop->Height) {
- printf("DrawMenuBar // menubar changed oldHeight=%d != lppop->Height=%d\n",
- oldHeight, lppop->Height);
- /* Reduce ClientRect according to MenuBar height */
- wndPtr->rectClient.top -= oldHeight;
- wndPtr->rectClient.top += lppop->Height;
- SendMessage(hWnd, WM_NCPAINT, 1, 0L);
- }
- else
- StdDrawMenuBar(hDC, &lppop->rect, lppop, FALSE);
- }
- else
- SendMessage(hWnd, WM_NCPAINT, 1, 0L);
+
+ lppop->Height = 0; /* Make sure we call MENU_MenuBarCalcSize */
+ SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
+ SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
GlobalUnlock(wndPtr->wIDmenu);
- }
+ }
}
@@ -2358,10 +2214,21 @@
*/
void InitStdBitmaps()
{
- if (hStdCheck == (HBITMAP)NULL)
- hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
- if (hStdMnArrow == (HBITMAP)NULL)
- hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW);
+ BITMAP bm;
+ if (hStdCheck == (HBITMAP)NULL)
+ {
+ hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK);
+ GetObject( hStdCheck, sizeof(BITMAP), (LPSTR)&bm );
+ check_bitmap_width = bm.bmWidth;
+ check_bitmap_height = bm.bmHeight;
+ }
+ if (hStdMnArrow == (HBITMAP)NULL)
+ {
+ hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW);
+ GetObject( hStdMnArrow, sizeof(BITMAP), (LPSTR)&bm );
+ arrow_bitmap_width = bm.bmWidth;
+ arrow_bitmap_height = bm.bmHeight;
+ }
}