WM_RBUTTONUP in tree control
Paul.B.Folbrecht@JCI.Com Tuesday, July 09, 1996 MSVC 4.1, Windows95 I've come across some strange behavior regarding WM_RBUTTONUP messages in a tree control (I'm using CTreeCtrl). Unless the mouse is moved between pressing the button and releasing it, the handler for WM_RBUTTONUP is never called. I confirm with Spy++ that each right click results in a WM_RBUTTONDOWN and A WM_RBUTTONUP, but the latter is somehow eaten up. A right-double click will result in the WM_RBUTTONUP handler being called. My tree control implements drag/drop with the RMB. This works fine the way things are, but I also want to put up a context menu when an item is right clicked if there's no drag operation in progress, ala Explorer. I set a flag in OnBeginDrag() that I check in OnLButtonUp(). This should work, but not when I'm not getting the messages! Does anyone have a workaround/alternate solution? -Paul Folbrecht Compuware Corp.
Steve Mark -- steve@otms.com Sunday, July 14, 1996 [Mini-digest: 2 responses] At 12:49 PM 7/9/96 -0600, Paul.B.Folbrecht@JCI.Com wrote: > MSVC 4.1, Windows95 > > I've come across some strange behavior regarding WM_RBUTTONUP messages > in a tree control (I'm using CTreeCtrl). Unless the mouse is moved > between pressing the button and releasing it, the handler for > WM_RBUTTONUP is never called. I confirm with Spy++ that each right > click results in a WM_RBUTTONDOWN and A WM_RBUTTONUP, but the latter > is somehow eaten up. A right-double click will result in the > WM_RBUTTONUP handler being called. > > My tree control implements drag/drop with the RMB. This works fine > the way things are, but I also want to put up a context menu when an > item is right clicked if there's no drag operation in progress, ala > Explorer. I set a flag in OnBeginDrag() that I check in > OnLButtonUp(). This should work, but not when I'm not getting the > messages! Does anyone have a workaround/alternate solution? > > -Paul Folbrecht > Compuware Corp. > I had exactly the same problem and worked around it by using OnRButtonDown. Try this: void NView::OnRButtonDown(UINT nFlags, CPoint point) { ClientToScreen(&point); OnContextMenu(NULL, point); //CTreeView::OnRButtonDown(nFlags, point); } Steve Mark On-The-Mark Systems -----From: IT GmbH <100031.1400@CompuServe.COM> Paul.B.Folbrecht wrote: [...] I also want to put up a context menu when an item is right clicked if there's no drag operation in progress, ala Explorer. [...] You may use the fact that the tree control sends a WM_CONTEXTMENU message to its parent (owner?) window on right button up. I had no problems careting a context menu on this message. - Klaus
Paul.B.Folbrecht@JCI.Com Wednesday, July 17, 1996 Thanks for the responses. Here was my solution: void CTreeViewEx::OnRButtonDown(UINT nFlags, CPoint point) { BOOL bDone = FALSE; POINT oNewPt; CTreeView::OnRButtonDown( nFlags, oPt ); // The following is a bug workaround: the tree does not get WM_RBUTTONUP // messages if no mouse movement occurs while the button is down. while ( !bDone ) { ::GetCursorPos( &oNewPt ); bDone = ( oPt != oNewPt || !( ::GetAsyncKeyState( VK_RBUTTON ) & 0x8000 ) ); } if ( !( ::GetAsyncKeyState( VK_RBUTTON ) & 0x8000 ) ) { // Put up context menu. Not terribly elegant, but it works. ______________________________ Reply Separator _________________________________ Subject: Re: WM_RBUTTONUP in tree control Author: steve@otms.com at Mailhub Date: 7/17/96 5:56 AM [Mini-digest: 2 responses] At 12:49 PM 7/9/96 -0600, Paul.B.Folbrecht@JCI.Com wrote: > MSVC 4.1, Windows95 > > I've come across some strange behavior regarding WM_RBUTTONUP messages > in a tree control (I'm using CTreeCtrl). Unless the mouse is moved > between pressing the button and releasing it, the handler for > WM_RBUTTONUP is never called. I confirm with Spy++ that each right > click results in a WM_RBUTTONDOWN and A WM_RBUTTONUP, but the latter > is somehow eaten up. A right-double click will result in the > WM_RBUTTONUP handler being called. > > My tree control implements drag/drop with the RMB. This works fine > the way things are, but I also want to put up a context menu when an > item is right clicked if there's no drag operation in progress, ala > Explorer. I set a flag in OnBeginDrag() that I check in > OnLButtonUp(). This should work, but not when I'm not getting the > messages! Does anyone have a workaround/alternate solution? > > -Paul Folbrecht > Compuware Corp. > I had exactly the same problem and worked around it by using OnRButtonDown. Try this: void NView::OnRButtonDown(UINT nFlags, CPoint point) { ClientToScreen(&point); OnContextMenu(NULL, point); //CTreeView::OnRButtonDown(nFlags, point); } Steve Mark On-The-Mark Systems -----From: IT GmbH <100031.1400@CompuServe.COM> Paul.B.Folbrecht wrote: [...] I also want to put up a context menu when an item is right clicked if there's no drag operation in progress, ala Explorer. [...] You may use the fact that the tree control sends a WM_CONTEXTMENU message to its parent (owner?) window on right button up. I had no problems careting a context menu on this message. - Klaus
| Вернуться в корень Архива |