From: Vladislav Timonin timoninvlad@yandex.ru
--- dlls/user32/tests/menu.c | 27 +++++++++++++++++++++++++++ dlls/win32u/menu.c | 3 +++ 2 files changed, 30 insertions(+)
diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c index f6b37365209..9cbd513232d 100644 --- a/dlls/user32/tests/menu.c +++ b/dlls/user32/tests/menu.c @@ -2631,6 +2631,33 @@ static void test_menu_hilitemenuitem( void ) ok(!(GetMenuState(hPopupMenu, 1, MF_BYPOSITION) & MF_HILITE), "HiliteMenuItem: Item 2 is hilited\n");
+ ok(HiliteMenuItem(hWnd, hPopupMenu, 0, MF_UNHILITE | MF_BYPOSITION), + "HiliteMenuItem: call should not have failed.\n"); + ok(!(GetMenuState(hPopupMenu, 0, MF_BYPOSITION) & MF_HILITE), + "HiliteMenuItem: Item 1 is hilited\n"); + AppendMenuA(hPopupMenu, MF_STRING, 103, "Item 3"); + + /* inserting into off-screen menu doesn't move hilite */ + + SetLastError(0xdeadbeef); + ok(HiliteMenuItem(hWnd, hPopupMenu, 1, MF_HILITE | MF_BYPOSITION), + "HiliteMenuItem: call should not have failed.\n"); + ok(GetLastError() == 0xdeadbeef, + "HiliteMenuItem: expected error 0xdeadbeef, got: %ld\n", GetLastError()); + ok(GetMenuState(hPopupMenu, 1, MF_BYPOSITION) & MF_HILITE, + "HiliteMenuItem: Item 2 is not hilited\n"); + + ok(InsertMenuA(hPopupMenu, 1, MF_STRING, 104, "Item 4"), + "InsertMenuA: call should have succeeded.\n"); + ok(!(GetMenuState(hPopupMenu, 0, MF_BYPOSITION) & MF_HILITE), + "HiliteMenuItem: Item 1 is hilited\n"); + ok(GetMenuState(hPopupMenu, 1, MF_BYPOSITION) & MF_HILITE, + "HiliteMenuItem: Item 4 is not hilited\n"); + ok(!(GetMenuState(hPopupMenu, 2, MF_BYPOSITION) & MF_HILITE), + "HiliteMenuItem: Item 2 is hilited\n"); + ok(!(GetMenuState(hPopupMenu, 3, MF_BYPOSITION) & MF_HILITE), + "HiliteMenuItem: Item 3 is hilited\n"); + DestroyWindow(hWnd); }
diff --git a/dlls/win32u/menu.c b/dlls/win32u/menu.c index 706c63b39c4..80d514f7b55 100644 --- a/dlls/win32u/menu.c +++ b/dlls/win32u/menu.c @@ -467,6 +467,9 @@ static struct menu *insert_menu_item( HMENU handle, UINT id, UINT flags, UINT *r memset( &new_items[pos], 0, sizeof(*new_items) ); menu->Height = 0; /* force size recalculate */
+ if (menu->FocusedItem != NO_SELECTED_ITEM && menu->FocusedItem >= pos) + menu->FocusedItem++; + *ret_pos = pos; return menu; }