Hello, This is patch #3 of 3 of menu bug fixes. This patch fixes the behavior of GetMenuItemRect() for top-level menus. GetMenuItemRect() was previously using window-relative positions for top-level menus instead of client-area relative positions. Thanks, Thomas Kho 2006-04-26 Thomas Kho * dlls/user/tests/menu.c: user: Fix GetMenuItemRect() for top-level menus menu.c | 16 ++++++++++++++-- tests/menu.c | 12 ++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) Signed-off-by: Thomas Kho diff -aur ../3/dlls/user/menu.c ./dlls/user/menu.c --- ../3/dlls/user/menu.c 2006-04-26 17:16:48.000000000 -0700 +++ ./dlls/user/menu.c 2006-04-26 17:17:06.000000000 -0700 @@ -4829,9 +4829,9 @@ item = MENU_FindItem (&hMenu, &uItem, MF_BYPOSITION); referenceHwnd = hwnd; + itemMenu = MENU_GetMenu(hMenu); if(!hwnd) { - itemMenu = MENU_GetMenu(hMenu); if (itemMenu == NULL) return FALSE; @@ -4845,7 +4845,19 @@ *rect = item->rect; - MapWindowPoints(referenceHwnd, 0, (LPPOINT)rect, 2); + if (itemMenu && !(itemMenu->wFlags & MF_POPUP)) + { + /* Perhaps this special case should be eliminated and the coordinates + * should be relative to client area instead of window frame */ + RECT rectWnd; + GetWindowRect(referenceHwnd, &rectWnd); + rect->top += rectWnd.top; + rect->bottom += rectWnd.top; + rect->left += rectWnd.left; + rect->right += rectWnd.left; + } + else + MapWindowPoints(referenceHwnd, 0, (LPPOINT)rect, 2); return TRUE; } diff -aur ../3/dlls/user/tests/menu.c ./dlls/user/tests/menu.c --- ../3/dlls/user/tests/menu.c 2006-04-26 17:16:49.000000000 -0700 +++ ./dlls/user/tests/menu.c 2006-04-26 17:17:07.000000000 -0700 @@ -1525,16 +1525,16 @@ { INPUT_KEYBOARD, {{0}}, {VK_LMENU, 'M', 'P', 0}, TRUE, FALSE }, { INPUT_KEYBOARD, {{0}}, {'E', 0}, FALSE, FALSE }, - { INPUT_MOUSE, {{1, 2}, {0}}, {0}, TRUE, TRUE }, /* test 18 */ + { INPUT_MOUSE, {{1, 2}, {0}}, {0}, TRUE, FALSE }, /* test 18 */ { INPUT_MOUSE, {{1, 1}, {0}}, {0}, FALSE, FALSE }, - { INPUT_MOUSE, {{1, 0}, {0}}, {0}, TRUE, TRUE }, + { INPUT_MOUSE, {{1, 0}, {0}}, {0}, TRUE, FALSE }, { INPUT_MOUSE, {{1, 1}, {0}}, {0}, FALSE, FALSE }, - { INPUT_MOUSE, {{1, 0}, {2, 2}, {0}}, {0}, TRUE, TRUE }, + { INPUT_MOUSE, {{1, 0}, {2, 2}, {0}}, {0}, TRUE, FALSE }, { INPUT_MOUSE, {{2, 1}, {0}}, {0}, FALSE, FALSE }, - { INPUT_MOUSE, {{1, 0}, {2, 0}, {0}}, {0}, TRUE, TRUE }, + { INPUT_MOUSE, {{1, 0}, {2, 0}, {0}}, {0}, TRUE, FALSE }, { INPUT_MOUSE, {{3, 0}, {0}}, {0}, FALSE, FALSE }, - { INPUT_MOUSE, {{1, 0}, {2, 0}, {0}}, {0}, TRUE, TRUE }, - { INPUT_MOUSE, {{3, 1}, {0}}, {0}, TRUE, TRUE }, + { INPUT_MOUSE, {{1, 0}, {2, 0}, {0}}, {0}, TRUE, FALSE }, + { INPUT_MOUSE, {{3, 1}, {0}}, {0}, TRUE, FALSE }, { INPUT_MOUSE, {{1, 1}, {0}}, {0}, FALSE, FALSE }, { -1 } };