From a0680b7d258de2ff85e9f9f0bc36de0ffcfaf90b Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Wed, 1 Jul 2009 21:56:44 +0000 Subject: [PATCH] Mikhail Denisenko - Add symbols to system menu by using marlett font. - See issue #4450 for details. svn path=/trunk/; revision=41733 --- reactos/dll/win32/user32/windows/menu.c | 131 +++++++++++++++++++----- 1 file changed, 108 insertions(+), 23 deletions(-) diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index 979a492b168..359992213a4 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -42,7 +42,6 @@ LRESULT DefWndNCPaint(HWND hWnd, HRGN hRgn, BOOL Active); #define IS_SYSTEM_POPUP(MenuInfo) \ (0 != ((MenuInfo)->Flags & MF_POPUP) && 0 != ((MenuInfo)->Flags & MF_SYSMENU)) -#define IS_MAGIC_ITEM(Bmp) ((int) Bmp <12) #define IS_MAGIC_BITMAP(id) ((id) && ((INT_PTR)(id) < 12) && ((INT_PTR)(id) >= -1)) #define MENU_ITEM_HBMP_SPACE (5) @@ -307,7 +306,7 @@ MenuGetBitmapItemSize(PROSMENUITEMINFO lpitem, SIZE *Size, HWND WndOwner) Size->cx = Size->cy = 0; /* check if there is a magic menu item associated with this item */ - if (0 != Bmp && IS_MAGIC_ITEM((INT)(Bmp))) + if (IS_MAGIC_BITMAP(Bmp)) { switch((INT_PTR) Bmp) { @@ -339,17 +338,14 @@ MenuGetBitmapItemSize(PROSMENUITEMINFO lpitem, SIZE *Size, HWND WndOwner) case (INT_PTR) HBMMENU_MBAR_CLOSE: case (INT_PTR) HBMMENU_MBAR_MINIMIZE_D: case (INT_PTR) HBMMENU_MBAR_CLOSE_D: - /* FIXME: Why we need to subtract these magic values? */ - /* to make them smaller than the menu bar? */ - Size->cx = GetSystemMetrics(SM_CXSIZE) - 2; - Size->cy = GetSystemMetrics(SM_CYSIZE) - 4; - return; case (INT_PTR) HBMMENU_POPUP_CLOSE: case (INT_PTR) HBMMENU_POPUP_RESTORE: case (INT_PTR) HBMMENU_POPUP_MAXIMIZE: case (INT_PTR) HBMMENU_POPUP_MINIMIZE: - default: - FIXME("Magic menu bitmap not implemented\n"); + /* FIXME: Why we need to subtract these magic values? */ + /* to make them smaller than the menu bar? */ + Size->cx = GetSystemMetrics(SM_CXSIZE) - 2; + Size->cy = GetSystemMetrics(SM_CYSIZE) - 4; return; } } @@ -361,6 +357,70 @@ MenuGetBitmapItemSize(PROSMENUITEMINFO lpitem, SIZE *Size, HWND WndOwner) } } +/*********************************************************************** + * MenuDrawPopupGlyph + * + * Draws popup magic glyphs (can be found in system menu). + */ +static void FASTCALL +MenuDrawPopupGlyph(HDC dc, LPRECT r, INT_PTR popupMagic, BOOL inactive, BOOL hilite) +{ + LOGFONTW lf; + HFONT hFont, hOldFont; + COLORREF clrsave; + INT bkmode; + TCHAR symbol; + switch (popupMagic) + { + case (INT_PTR) HBMMENU_POPUP_RESTORE: + symbol = '2'; + break; + case (INT_PTR) HBMMENU_POPUP_MINIMIZE: + symbol = '0'; + break; + case (INT_PTR) HBMMENU_POPUP_MAXIMIZE: + symbol = '1'; + break; + case (INT_PTR) HBMMENU_POPUP_CLOSE: + symbol = 'r'; + break; + default: + ERR("Invalid popup magic bitmap %d\n", (int)popupMagic); + return; + } + ZeroMemory(&lf, sizeof(LOGFONTW)); + InflateRect(r, -2, -2); + lf.lfHeight = r->bottom - r->top; + lf.lfWidth = 0; + lf.lfWeight = FW_NORMAL; + lf.lfCharSet = DEFAULT_CHARSET; + lstrcpy(lf.lfFaceName, TEXT("Marlett")); + hFont = CreateFontIndirect(&lf); + /* save font and text color */ + hOldFont = SelectObject(dc, hFont); + clrsave = GetTextColor(dc); + bkmode = GetBkMode(dc); + /* set color and drawing mode */ + SetBkMode(dc, TRANSPARENT); + if (inactive) + { + /* draw shadow */ + if (!hilite) + { + SetTextColor(dc, GetSysColor(COLOR_HIGHLIGHTTEXT)); + TextOut(dc, r->left + 1, r->top + 1, &symbol, 1); + } + } + SetTextColor(dc, GetSysColor(inactive ? COLOR_GRAYTEXT : (hilite ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT))); + /* draw selected symbol */ + TextOut(dc, r->left, r->top, &symbol, 1); + /* restore previous settings */ + SetTextColor(dc, clrsave); + SelectObject(dc, hOldFont); + SetBkMode(dc, bkmode); + DeleteObject(hFont); +} + /*********************************************************************** * MenuDrawBitmapItem * @@ -382,7 +442,7 @@ MenuDrawBitmapItem(HDC Dc, PROSMENUITEMINFO Item, const RECT *Rect, Bmp = hbmpToDraw; /* Check if there is a magic menu item associated with this item */ - if (IS_MAGIC_ITEM(hbmpToDraw)) + if (IS_MAGIC_BITMAP(hbmpToDraw)) { UINT Flags = 0; RECT r; @@ -459,8 +519,7 @@ MenuDrawBitmapItem(HDC Dc, PROSMENUITEMINFO Item, const RECT *Rect, case (INT_PTR) HBMMENU_POPUP_RESTORE: case (INT_PTR) HBMMENU_POPUP_MAXIMIZE: case (INT_PTR) HBMMENU_POPUP_MINIMIZE: - default: - FIXME("Magic menu bitmap not implemented\n"); + MenuDrawPopupGlyph(Dc, &r, (INT_PTR)hbmpToDraw, Item->fState & MF_GRAYED, Item->fState & MF_HILITE); return; } InflateRect(&r, -1, -1); @@ -736,9 +795,17 @@ MenuDrawMenuItem(HWND hWnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, checked = TRUE; } } - if ((Item->hbmpItem)&& !( checked && (MenuInfo->dwStyle & MNS_CHECKORBMP))) + if (Item->hbmpItem) { - MenuDrawBitmapItem(Dc, Item, &Rect, MenuInfo->Self, WndOwner, Action, MenuBar); + RECT bmpRect; + CopyRect(&bmpRect, &Rect); + if (!(MenuInfo->dwStyle & MNS_CHECKORBMP) && !(MenuInfo->dwStyle & MNS_NOCHECK)) + bmpRect.left += CheckBitmapWidth + 2; + if (!(checked && (MenuInfo->dwStyle & MNS_CHECKORBMP))) + { + bmpRect.right = bmpRect.left + MenuInfo->maxBmpSize.cx; + MenuDrawBitmapItem(Dc, Item, &bmpRect, MenuInfo->Self, WndOwner, Action, MenuBar); + } } /* Draw the popup-menu arrow */ if (0 != (Item->fType & MF_POPUP)) @@ -767,7 +834,9 @@ MenuDrawMenuItem(HWND hWnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, UINT uFormat = MenuBar ? DT_CENTER | DT_VCENTER | DT_SINGLELINE : DT_LEFT | DT_VCENTER | DT_SINGLELINE; - if( !(MenuInfo->dwStyle & MNS_CHECKORBMP)) + if(MenuInfo->dwStyle & MNS_CHECKORBMP) + Rect.left += max(0, MenuInfo->maxBmpSize.cx - GetSystemMetrics(SM_CXMENUCHECK)); + else Rect.left += MenuInfo->maxBmpSize.cx; if (0 != (Item->fState & MFS_DEFAULT)) @@ -780,11 +849,6 @@ MenuDrawMenuItem(HWND hWnd, PROSMENUINFO MenuInfo, HWND WndOwner, HDC Dc, Rect.left += MENU_BAR_ITEMS_SPACE / 2; Rect.right -= MENU_BAR_ITEMS_SPACE / 2; } - if (Item->hbmpItem == HBMMENU_CALLBACK || MenuInfo->maxBmpSize.cx != 0 ) - { - Rect.left += MenuInfo->maxBmpSize.cx; - Rect.right -= MenuInfo->maxBmpSize.cx; - } Text = (PWCHAR) Item->dwTypeData; if(Text) @@ -1103,8 +1167,30 @@ static LPCSTR MENU_ParseResource( LPCSTR res, HMENU hMenu, BOOL unicode ) NTSTATUS WINAPI User32LoadSysMenuTemplateForKernel(PVOID Arguments, ULONG ArgumentLength) { - LRESULT Result; - Result = (LRESULT)LoadMenuW(User32Instance, L"SYSMENU"); + HMENU hmenu = LoadMenuW(User32Instance, L"SYSMENU"); + LRESULT Result = (LRESULT)hmenu; + + // removing space for checkboxes from menu + MENUINFO menuinfo = {0}; + menuinfo.cbSize = sizeof(menuinfo); + menuinfo.fMask = MIM_STYLE; + GetMenuInfo(hmenu, &menuinfo); + menuinfo.dwStyle |= MNS_NOCHECK; + SetMenuInfo(hmenu, &menuinfo); + + // adding bitmaps to menu items + MENUITEMINFOW info = {0}; + info.cbSize = sizeof(info); + info.fMask |= MIIM_BITMAP; + info.hbmpItem = HBMMENU_POPUP_MINIMIZE; + SetMenuItemInfoW(hmenu, SC_MINIMIZE, FALSE, &info); + info.hbmpItem = HBMMENU_POPUP_RESTORE; + SetMenuItemInfoW(hmenu, SC_RESTORE, FALSE, &info); + info.hbmpItem = HBMMENU_POPUP_MAXIMIZE; + SetMenuItemInfoW(hmenu, SC_MAXIMIZE, FALSE, &info); + info.hbmpItem = HBMMENU_POPUP_CLOSE; + SetMenuItemInfoW(hmenu, SC_CLOSE, FALSE, &info); + return(ZwCallbackReturn(&Result, sizeof(LRESULT), STATUS_SUCCESS)); } @@ -1247,7 +1333,6 @@ MenuCalcItemSize(HDC Dc, PROSMENUITEMINFO ItemInfo, PROSMENUINFO MenuInfo, HWND MenuInfo->maxBmpSize.cy = abs(Size.cy); } MenuSetRosMenuInfo(MenuInfo); - ItemInfo->Rect.right += Size.cx + 2; itemheight = Size.cy + 2; if( !(MenuInfo->dwStyle & MNS_NOCHECK))