[PATCH 3/3] user32: Don't depend on HMENU for drawing menus

Andrew Eikum aeikum at codeweavers.com
Fri May 9 14:13:07 CDT 2014


---
 dlls/user32/menu.c | 31 +++++++++++++++----------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 739e818..d6e44d6 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -192,7 +192,7 @@ const struct builtin_class_descr MENU_builtin_class =
     (LPCWSTR)POPUPMENU_CLASS_ATOM,  /* name */
     CS_DROPSHADOW | CS_SAVEBITS | CS_DBLCLKS,  /* style */
     WINPROC_MENU,                  /* proc */
-    sizeof(HMENU),                 /* extra */
+    sizeof(POPUPMENU *),           /* extra */
     IDC_ARROW,                     /* cursor */
     (HBRUSH)(COLOR_MENU+1)         /* brush */
 };
@@ -1731,12 +1731,12 @@ static void MENU_DrawMenuItem( HWND hwnd, POPUPMENU *menu, HWND hwndOwner, HDC h
  *
  * Paint a popup menu.
  */
-static void MENU_DrawPopupMenu( HWND hwnd, HDC hdc, HMENU hmenu )
+static void MENU_DrawPopupMenu( HWND hwnd, HDC hdc, POPUPMENU *menu )
 {
     HBRUSH hPrevBrush = 0;
     RECT rect;
 
-    TRACE("wnd=%p dc=%p menu=%p\n", hwnd, hdc, hmenu);
+    TRACE("wnd=%p dc=%p menu=%p\n", hwnd, hdc, menu);
 
     GetClientRect( hwnd, &rect );
 
@@ -1750,7 +1750,6 @@ static void MENU_DrawPopupMenu( HWND hwnd, HDC hdc, HMENU hmenu )
 	hPrevPen = SelectObject( hdc, GetStockObject( NULL_PEN ) );
 	if( hPrevPen )
 	{
-	    POPUPMENU *menu;
 	    BOOL flat_menu = FALSE;
 
 	    SystemParametersInfoW (SPI_GETFLATMENU, 0, &flat_menu, 0);
@@ -1759,9 +1758,9 @@ static void MENU_DrawPopupMenu( HWND hwnd, HDC hdc, HMENU hmenu )
 	    else
 		DrawEdge (hdc, &rect, EDGE_RAISED, BF_RECT);
 
-            if( (menu = MENU_GetMenu( hmenu )))
+            if( menu )
             {
-                TRACE("hmenu %p Style %08x\n", hmenu, menu->dwStyle);
+                TRACE("menu %p Style %08x\n", menu, menu->dwStyle);
                 /* draw menu items */
                 if( menu->nItems)
                 {
@@ -1833,7 +1832,7 @@ static BOOL MENU_InitPopup( HWND hwndOwner, POPUPMENU *menu, UINT flags )
     menu->hWnd = CreateWindowExW( ex_style, (LPCWSTR)POPUPMENU_CLASS_ATOM, NULL,
                                 WS_POPUP, 0, 0, 0, 0,
                                 hwndOwner, 0, (HINSTANCE)GetWindowLongPtrW(hwndOwner, GWLP_HINSTANCE),
-                                (LPVOID)MENU_GetHandle(menu) );
+                                menu );
     if( !menu->hWnd ) return FALSE;
     return TRUE;
 }
@@ -3484,7 +3483,7 @@ LRESULT WINAPI PopupMenuWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM
 	    PAINTSTRUCT ps;
 	    BeginPaint( hwnd, &ps );
 	    MENU_DrawPopupMenu( hwnd, ps.hdc,
-                                (HMENU)GetWindowLongPtrW( hwnd, 0 ) );
+                                (POPUPMENU *)GetWindowLongPtrW( hwnd, 0 ) );
 	    EndPaint( hwnd, &ps );
             return 0;
 	}
@@ -3492,7 +3491,7 @@ LRESULT WINAPI PopupMenuWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM
     case WM_PRINTCLIENT:
 	{
 	    MENU_DrawPopupMenu( hwnd, (HDC)wParam,
-                                (HMENU)GetWindowLongPtrW( hwnd, 0 ) );
+                                (POPUPMENU *)GetWindowLongPtrW( hwnd, 0 ) );
             return 0;
         }
 
@@ -3518,7 +3517,7 @@ LRESULT WINAPI PopupMenuWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM
 	break;
 
     case MN_GETHMENU:
-        return GetWindowLongPtrW( hwnd, 0 );
+        return (LRESULT)MENU_GetHandle((POPUPMENU*)GetWindowLongPtrW( hwnd, 0 ));
 
     default:
         return DefWindowProcW( hwnd, message, wParam, lParam );
@@ -4209,30 +4208,30 @@ BOOL WINAPI GetMenuBarInfo( HWND hwnd, LONG idObject, LONG idItem, PMENUBARINFO
             return FALSE;
         }
 
-        hmenu = (HMENU)GetWindowLongPtrW(hwnd, 0);
+        menu = (POPUPMENU *)GetWindowLongPtrW(hwnd, 0);
+        hmenu = MENU_GetHandle(menu);
         break;
     case OBJID_MENU:
         hmenu = GetMenu(hwnd);
+        menu = MENU_GetMenu(hmenu);
         break;
     case OBJID_SYSMENU:
         hmenu = GetSystemMenu(hwnd, FALSE);
+        menu = MENU_GetMenu(hmenu);
         break;
     default:
         return FALSE;
     }
 
-    if (!hmenu)
-        return FALSE;
-
     if (pmbi->cbSize != sizeof(MENUBARINFO))
     {
         SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
     }
 
-    menu = MENU_GetMenu(hmenu);
-    if (!menu)
+    if (!menu || !hmenu)
         return FALSE;
+
     if (idItem < 0 || idItem > menu->nItems)
         return FALSE;
 
-- 
1.9.2




More information about the wine-patches mailing list