Module: wine Branch: master Commit: 0c6e37bb045e3ba710978da644d6caf076d4fb79 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0c6e37bb045e3ba710978da644...
Author: Rein Klazes wijn@online.nl Date: Fri Feb 20 15:28:37 2009 +0100
user32: Implement support for HBMENU_POPUP_* magic menu bitmaps and use them to decorate the system menu.
---
dlls/user32/menu.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c index efb14c6..1df3675 100644 --- a/dlls/user32/menu.c +++ b/dlls/user32/menu.c @@ -419,8 +419,24 @@ static HMENU MENU_CopySysPopup(void) HMENU hMenu = LoadMenuW(user32_module, sysmenuW);
if( hMenu ) { + MENUINFO minfo; + MENUITEMINFOW miteminfo; POPUPMENU* menu = MENU_GetMenu(hMenu); menu->wFlags |= MF_SYSMENU | MF_POPUP; + minfo.cbSize = sizeof( MENUINFO); + minfo.dwStyle = MNS_CHECKORBMP; + minfo.fMask = MIM_STYLE; + SetMenuInfo( hMenu, &minfo); + miteminfo.cbSize = sizeof( MENUITEMINFOW); + miteminfo.fMask = MIIM_BITMAP; + miteminfo.hbmpItem = HBMMENU_POPUP_CLOSE; + SetMenuItemInfoW( hMenu, SC_CLOSE, FALSE, &miteminfo); + miteminfo.hbmpItem = HBMMENU_POPUP_RESTORE; + SetMenuItemInfoW( hMenu, SC_RESTORE, FALSE, &miteminfo); + miteminfo.hbmpItem = HBMMENU_POPUP_MAXIMIZE; + SetMenuItemInfoW( hMenu, SC_MAXIMIZE, FALSE, &miteminfo); + miteminfo.hbmpItem = HBMMENU_POPUP_MINIMIZE; + SetMenuItemInfoW( hMenu, SC_MINIMIZE, FALSE, &miteminfo); SetMenuDefaultItem(hMenu, SC_CLOSE, FALSE); } else @@ -819,7 +835,8 @@ static void MENU_GetBitmapItemSize( MENUITEM *lpitem, SIZE *size, case (INT_PTR)HBMMENU_POPUP_RESTORE: case (INT_PTR)HBMMENU_POPUP_MAXIMIZE: case (INT_PTR)HBMMENU_POPUP_MINIMIZE: - FIXME("Magic %p not implemented\n", bmp ); + size->cx = GetSystemMetrics( SM_CYMENU ) - 4; /* FIXME: test */ + size->cy = size->cx; return; } if (GetObjectW(bmp, sizeof(bm), &bm )) @@ -852,6 +869,7 @@ static void MENU_DrawBitmapItem( HDC hdc, MENUITEM *lpitem, const RECT *rect, if (IS_MAGIC_BITMAP(hbmToDraw)) { UINT flags = 0; + WCHAR bmchr = 0; RECT r;
switch((INT_PTR)hbmToDraw) @@ -910,17 +928,42 @@ static void MENU_DrawBitmapItem( HDC hdc, MENUITEM *lpitem, const RECT *rect, } break; case (INT_PTR)HBMMENU_POPUP_CLOSE: + bmchr = 0x72; + break; case (INT_PTR)HBMMENU_POPUP_RESTORE: + bmchr = 0x32; + break; case (INT_PTR)HBMMENU_POPUP_MAXIMIZE: + bmchr = 0x31; + break; case (INT_PTR)HBMMENU_POPUP_MINIMIZE: + bmchr = 0x30; + break; default: FIXME("Magic %p not implemented\n", hbmToDraw); return; } - r = *rect; - InflateRect( &r, -1, -1 ); - if (lpitem->fState & MF_HILITE) flags |= DFCS_PUSHED; - DrawFrameControl( hdc, &r, DFC_CAPTION, flags ); + if (bmchr) + { + HFONT hfont, hfontsav; + LOGFONTW logfont = { 0, 0, 0, 0, FW_NORMAL, + 0, 0, 0, SYMBOL_CHARSET, 0, 0, 0, 0, + { 'M','a','r','l','e','t','t',0 } }; + logfont.lfHeight = min( h, w) - 2 ; + TRACE(" height %d rect %s\n", logfont.lfHeight, wine_dbgstr_rect( rect)); + hfont = CreateFontIndirectW( &logfont); + hfontsav = SelectObject(hdc, hfont); + TextOutW( hdc, rect->left, rect->top, &bmchr, 1); + SelectObject(hdc, hfontsav); + DeleteObject( hfont); + } + else + { + r = *rect; + InflateRect( &r, -1, -1 ); + if (lpitem->fState & MF_HILITE) flags |= DFCS_PUSHED; + DrawFrameControl( hdc, &r, DFC_CAPTION, flags ); + } return; }