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