switch ( nMsg )
{
- case WM_RBUTTONDOWN:
- // if the item we are about to right click on is not already
- // selected or if we click outside of any item, remove the
- // entire previous selection
- if ( !htItem || !::IsItemSelected(GetHwnd(), htItem) )
- {
- UnselectAll();
- }
-
- // select item and set the focus to the
- // newly selected item
- ::SelectItem(GetHwnd(), htItem);
- ::SetFocus(GetHwnd(), htItem);
- break;
-
case WM_LBUTTONDOWN:
if ( htItem && isMultiple && (tvht.flags & TVHT_ONITEM) != 0 )
{
WXLRESULT
wxTreeCtrl::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
- // default WM_RBUTTONDOWN handler enters modal loop inside DefWindowProc()
- // waiting for WM_RBUTTONUP and then sends the resulting WM_CONTEXTMENU to
- // the parent window, not us, which completely breaks everything so simply
- // don't let it see this message at all
- if ( nMsg == WM_RBUTTONDOWN )
- return 0;
-
- // but because of the above we don't get NM_RCLICK which is normally
- // generated by tree window proc when the modal loop mentioned above ends
- // because the mouse is released -- synthesize it ourselves instead
- if ( nMsg == WM_RBUTTONUP )
- {
- NMHDR hdr;
- hdr.hwndFrom = GetHwnd();
- hdr.idFrom = GetId();
- hdr.code = NM_RCLICK;
-
- WXLPARAM rc;
- MSWOnNotify(GetId(), (LPARAM)&hdr, &rc);
-
- // continue as usual
- }
-
if ( nMsg == WM_CHAR )
{
- // also don't let the control process Space and Return keys because it
+ // don't let the control process Space and Return keys because it
// doesn't do anything useful with them anyhow but always beeps
// annoyingly when it receives them and there is no way to turn it off
// simply if you just process TREEITEM_ACTIVATED event to which Space
break;
}
-#endif
-#endif
+#endif // TVN_GETINFOTIP
+#endif // !__WXWINCE__
case TVN_GETDISPINFO:
eventType = wxEVT_COMMAND_TREE_GET_INFO;
*result = false;
break;
+ case NM_RCLICK:
+ // prevent tree control from sending WM_CONTEXTMENU to our parent
+ // (which it does if NM_RCLICK is not handled) because we want to
+ // send it to the control itself
+ *result =
+ processed = true;
+
+ ::SendMessage(GetHwnd(), WM_CONTEXTMENU,
+ (WPARAM)GetHwnd(), ::GetMessagePos());
+ break;
+
case TVN_BEGINDRAG:
case TVN_BEGINRDRAG:
if ( event.IsAllowed() )