I'm back, after a while. :) Example app fixed: DesignWorks 3.20 (still not working, BTW) (This app creates window of size about (200,1) and later adds dynamically created menu to it before showing it.) ChangeLog: - Fix adding of menu after CreateWindow*() and before ShowWindow() Index: dlls/user/controls.h =================================================================== RCS file: /home/wine/wine/dlls/user/controls.h,v retrieving revision 1.12 diff -u -r1.12 controls.h --- dlls/user/controls.h 10 Sep 2003 03:56:47 -0000 1.12 +++ dlls/user/controls.h 19 Sep 2003 03:14:34 -0000 @@ -62,6 +62,7 @@ extern UINT MENU_DrawMenuBar( HDC hDC, LPRECT lprect, HWND hwnd, BOOL suppress_draw ); extern UINT MENU_FindSubMenu( HMENU *hmenu, HMENU hSubTarget ); +extern BOOL MENU_SetMenu(HWND hWnd32, HMENU hMenu); /* scrollbar */ extern void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, INT nBar, BOOL arrows, BOOL interior ); Index: windows/win.c =================================================================== RCS file: /home/wine/wine/windows/win.c,v retrieving revision 1.224 diff -u -r1.224 win.c --- windows/win.c 5 Sep 2003 23:15:39 -0000 1.224 +++ windows/win.c 19 Sep 2003 03:14:43 -0000 @@ -1115,7 +1115,7 @@ if (((wndPtr->dwStyle & (WS_CAPTION|WS_CHILD)) == WS_CAPTION) || (wndPtr->dwExStyle & WS_EX_APPWINDOW)) { - if (cs->hMenu) SetMenu(hwnd, cs->hMenu); + if (cs->hMenu) MENU_SetMenu(hwnd, cs->hMenu); else { LPCSTR menuName = (LPCSTR)GetClassLongA( hwnd, GCL_MENUNAME ); @@ -1126,7 +1126,7 @@ else cs->hMenu = HMENU_32(LoadMenu16(HINSTANCE_16(cs->hInstance),menuName)); - if (cs->hMenu) SetMenu( hwnd, cs->hMenu ); + if (cs->hMenu) MENU_SetMenu( hwnd, cs->hMenu ); } } } Index: controls/menu.c =================================================================== RCS file: /home/wine/wine/controls/menu.c,v retrieving revision 1.168 diff -u -r1.168 menu.c --- controls/menu.c 17 Sep 2003 04:28:29 -0000 1.168 +++ controls/menu.c 19 Sep 2003 03:17:23 -0000 @@ -3753,11 +3753,12 @@ return retvalue; } - /********************************************************************** - * SetMenu (USER32.@) + * MENU_SetMenu + * + * Set menu for window hWnd (32-bit mode handle; allowed to get menu). */ -BOOL WINAPI SetMenu( HWND hWnd, HMENU hMenu ) +BOOL MENU_SetMenu( HWND hWnd, HMENU hMenu ) { TRACE("(%p, %p);\n", hWnd, hMenu); @@ -3766,9 +3767,7 @@ WARN("hMenu %p is not a menu handle\n", hMenu); return FALSE; } - if (GetWindowLongA( hWnd, GWL_STYLE ) & WS_CHILD) return FALSE; - hWnd = WIN_GetFullHandle( hWnd ); if (GetCapture() == hWnd) MENU_SetCapture(0); /* release the capture */ if (hMenu != 0) @@ -3782,9 +3781,24 @@ } SetWindowLongA( hWnd, GWL_ID, (LONG_PTR)hMenu ); - if (IsWindowVisible(hWnd)) - SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | - SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED ); + return TRUE; +} + +/********************************************************************** + * SetMenu (USER32.@) + */ +BOOL WINAPI SetMenu( HWND hWnd, HMENU hMenu ) +{ + TRACE("(%p, %p);\n", hWnd, hMenu); + + if (GetWindowLongA( hWnd, GWL_STYLE ) & WS_CHILD) return FALSE; + + hWnd = WIN_GetFullHandle( hWnd ); + if (!MENU_SetMenu( hWnd, hMenu )) + return FALSE; + + SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED ); return TRUE; }