Mikhail Denisenko <denisenkom AT gmail DOT com>

- Add symbols to system menu by using marlett font.
- See issue #4450 for details.

svn path=/trunk/; revision=41733
This commit is contained in:
Matthias Kupfer 2009-07-01 21:56:44 +00:00
parent 9f3c9390f1
commit a0680b7d25

View file

@ -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))