Rein Klazes : user32: Implement support for HBMENU_POPUP_* magic menu bitmaps and use them to decorate the system menu .
Alexandre Julliard
julliard at winehq.org
Fri Feb 20 12:49:42 CST 2009
Module: wine
Branch: master
Commit: 0c6e37bb045e3ba710978da644d6caf076d4fb79
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0c6e37bb045e3ba710978da644d6caf076d4fb79
Author: Rein Klazes <wijn at 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;
}
More information about the wine-cvs
mailing list