Author: mkupfer
Date: Thu Jul 2 01:56:44 2009
New Revision: 41733
URL:
http://svn.reactos.org/svn/reactos?rev=41733&view=rev
Log:
Mikhail Denisenko <denisenkom AT gmail DOT com>
- Add symbols to system menu by using marlett font.
- See issue #4450 for details.
Modified:
trunk/reactos/dll/win32/user32/windows/menu.c
Modified: trunk/reactos/dll/win32/user32/windows/menu.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/m…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/menu.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/menu.c [iso-8859-1] Thu Jul 2 01:56:44 2009
@@ -42,7 +42,6 @@
#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 @@
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,18 +338,15 @@
case (INT_PTR) HBMMENU_MBAR_CLOSE:
case (INT_PTR) HBMMENU_MBAR_MINIMIZE_D:
case (INT_PTR) HBMMENU_MBAR_CLOSE_D:
+ case (INT_PTR) HBMMENU_POPUP_CLOSE:
+ case (INT_PTR) HBMMENU_POPUP_RESTORE:
+ case (INT_PTR) HBMMENU_POPUP_MAXIMIZE:
+ case (INT_PTR) HBMMENU_POPUP_MINIMIZE:
/* 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");
- return;
}
}
@@ -359,6 +355,70 @@
Size->cx = Bm.bmWidth;
Size->cy = Bm.bmHeight;
}
+}
+
+/***********************************************************************
+ * 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);
}
/***********************************************************************
@@ -382,7 +442,7 @@
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 @@
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 @@
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 @@
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))
@@ -779,11 +848,6 @@
{
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;
@@ -1103,8 +1167,30 @@
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 @@
MenuInfo->maxBmpSize.cy = abs(Size.cy);
}
MenuSetRosMenuInfo(MenuInfo);
- ItemInfo->Rect.right += Size.cx + 2;
itemheight = Size.cy + 2;
if( !(MenuInfo->dwStyle & MNS_NOCHECK))