user32: implement support for HBMENU_POPUP_* magic menu bitmaps and use them to decorate the system menu.
Rein Klazes
wijn at online.nl
Fri Feb 20 08:28:37 CST 2009
---
dlls/user32/menu.c | 50 +++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 45 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index efb14c6..635ccaf 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;
+ static WCHAR bmchr[2] = { 0, 0};
RECT r;
switch((INT_PTR)hbmToDraw)
@@ -910,17 +928,39 @@ static void MENU_DrawBitmapItem( HDC hdc, MENUITEM *lpitem, const RECT *rect,
}
break;
case (INT_PTR)HBMMENU_POPUP_CLOSE:
+ bmchr[0] = 0x72;
+ break;
case (INT_PTR)HBMMENU_POPUP_RESTORE:
+ bmchr[0] = 0x32;
+ break;
case (INT_PTR)HBMMENU_POPUP_MAXIMIZE:
+ bmchr[0] = 0x31;
+ break;
case (INT_PTR)HBMMENU_POPUP_MINIMIZE:
+ bmchr[0] = 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[0]) {
+ 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;
}
--
1.5.6.5
--------------000107070506090907060006--
More information about the wine-patches
mailing list