Windows sends events even if the mouse is clicked in the area below the items,
filter them out by checking the item under the mouse ourselves.
Also use synchronous GetMessagePos() function to get the mouse position
instead of the asynchronous GetCursorPos() which was wrongly used by the old
code.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64499
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// item ourselves below in this case.
n = SendMessage(GetHwnd(), LB_GETCARETINDEX, 0, 0);
}
// item ourselves below in this case.
n = SendMessage(GetHwnd(), LB_GETCARETINDEX, 0, 0);
}
- else
- {
- n = HitTest(ScreenToClient(wxGetMousePosition()));
- }
+ //else: n will be determined below from the mouse position
}
else if ( param == LBN_DBLCLK )
{
evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED;
}
else if ( param == LBN_DBLCLK )
{
evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED;
- n = HitTest(ScreenToClient(wxGetMousePosition()));
- // only send an event if we have a valid item
+ // Find the item position if it was a mouse-generated selection event or a
+ // double click event (which is always generated using the mouse)
+ if ( n == wxNOT_FOUND )
+ {
+ const DWORD pos = ::GetMessagePos();
+ const wxPoint pt(GET_X_LPARAM(pos), GET_Y_LPARAM(pos));
+ n = HitTest(ScreenToClient(wxPoint(pt)));
+ }
+
+ // We get events even when mouse is clicked outside of any valid item from
+ // Windows, just ignore them.
return n != wxNOT_FOUND && SendEvent(evtType, n, true /* selection */);
}
return n != wxNOT_FOUND && SendEvent(evtType, n, true /* selection */);
}