How to tell when a view loses focus when the user has the right mouse button down and moves out of the view?
-
Hi All, VC++ 6, MFC, WinXP My application's main interface consists of a FormView with a few controls – a tab control and a custom CView based control. In operation, the user *should* (yes, I know …not in the real world) click and then release the left mouse button in this view make a selection. The act of clicking starts a process and the act of releasing ends the process. Specifically, the application sends MIDI notes, similar to a piano keyboard control: MIDI note ON when the left mouse button is pressed, and MIDI note OFF when the button released. I need to send a MIDI note OFF message if the user drags out of the selection window - that would stop the note from playing when the mouse leaves the window. The idea is as long as the left mouse button is pressed, the note will play. All works fine when the user clicks and releases in the same view but if they click, drag away, then release in a different view, the original view does not get notified and the selection remains - in other words, the note stays playing. I’ve looked through the forums and articles and have tried a few of the suggestions but have yet not found any method to get notified immediately when the mouse leaves the active view if the left button is still down. Most of the methods have a "delayed action" before they notify the original view and only seem to trigger if the user clicks on another view - AFTER they released the left mouse initially on that non-original view. I need to find a way to get notified immediately should the mouse leave the active view when its left button is down. Any suggestions and help would be appreciated. Paul
-
Hi All, VC++ 6, MFC, WinXP My application's main interface consists of a FormView with a few controls – a tab control and a custom CView based control. In operation, the user *should* (yes, I know …not in the real world) click and then release the left mouse button in this view make a selection. The act of clicking starts a process and the act of releasing ends the process. Specifically, the application sends MIDI notes, similar to a piano keyboard control: MIDI note ON when the left mouse button is pressed, and MIDI note OFF when the button released. I need to send a MIDI note OFF message if the user drags out of the selection window - that would stop the note from playing when the mouse leaves the window. The idea is as long as the left mouse button is pressed, the note will play. All works fine when the user clicks and releases in the same view but if they click, drag away, then release in a different view, the original view does not get notified and the selection remains - in other words, the note stays playing. I’ve looked through the forums and articles and have tried a few of the suggestions but have yet not found any method to get notified immediately when the mouse leaves the active view if the left button is still down. Most of the methods have a "delayed action" before they notify the original view and only seem to trigger if the user clicks on another view - AFTER they released the left mouse initially on that non-original view. I need to find a way to get notified immediately should the mouse leave the active view when its left button is down. Any suggestions and help would be appreciated. Paul
See CWnd::SetCapture[^], this redirects all mouse messages to the given window until you either call ReleaseCapture or the mouse capture is lost because of some other event (then you get WM_MOUSECAPTURED[^] to notify you about this, you get this also when calling SetCapture/ReleaseCapture explicitly), alternatively, see TrackMouseEvent[^], maybe that better suits your needs.
> The problem with computers is that they do what you tell them to do and not what you want them to do. < > Leela: Fry, you're wasting your life sitting in front of that TV. You need to get out and see the real world. Fry: But this is HDTV. It's got better resolution than the real world <
-
See CWnd::SetCapture[^], this redirects all mouse messages to the given window until you either call ReleaseCapture or the mouse capture is lost because of some other event (then you get WM_MOUSECAPTURED[^] to notify you about this, you get this also when calling SetCapture/ReleaseCapture explicitly), alternatively, see TrackMouseEvent[^], maybe that better suits your needs.
> The problem with computers is that they do what you tell them to do and not what you want them to do. < > Leela: Fry, you're wasting your life sitting in front of that TV. You need to get out and see the real world. Fry: But this is HDTV. It's got better resolution than the real world <
Works perfectly! SetCapture() in the OnLButtonDown() handler and ReleaseCapture() in the OnLButtonUp() handler gives me better functionality. Now as long as the user lets go of the left mouse button anywhere, the view gets the mouse input and the OFF command is sent. Thank you for the direction and the links (and lesson)! Best Regards, Paul
-
Works perfectly! SetCapture() in the OnLButtonDown() handler and ReleaseCapture() in the OnLButtonUp() handler gives me better functionality. Now as long as the user lets go of the left mouse button anywhere, the view gets the mouse input and the OFF command is sent. Thank you for the direction and the links (and lesson)! Best Regards, Paul
Yourwelcome. Just be careful, as i said, you might lose the mouse capture because of some "external" event, like a dialog box popping up from another application, and if you don't handle this correctly the user might need to click the correct spot in your application to trigger a button-up. I suggest, in OnLButtonDown, use SetCapture to grab the mouse input and start your midi play, in OnLButtonUp, use ReleaseCapture and in OnCaptureChanged, if you are loosing the capture, stop the sound. This way, both if the user releases the key or some other event triggers the capture-change, you won't end up with your program playing the sound endlessly.
> The problem with computers is that they do what you tell them to do and not what you want them to do. < > Leela: Fry, you're wasting your life sitting in front of that TV. You need to get out and see the real world. Fry: But this is HDTV. It's got better resolution than the real world <
-
Yourwelcome. Just be careful, as i said, you might lose the mouse capture because of some "external" event, like a dialog box popping up from another application, and if you don't handle this correctly the user might need to click the correct spot in your application to trigger a button-up. I suggest, in OnLButtonDown, use SetCapture to grab the mouse input and start your midi play, in OnLButtonUp, use ReleaseCapture and in OnCaptureChanged, if you are loosing the capture, stop the sound. This way, both if the user releases the key or some other event triggers the capture-change, you won't end up with your program playing the sound endlessly.
> The problem with computers is that they do what you tell them to do and not what you want them to do. < > Leela: Fry, you're wasting your life sitting in front of that TV. You need to get out and see the real world. Fry: But this is HDTV. It's got better resolution than the real world <
Oh, I have to admit I missed that suggestion before but it makes perfect sense. I've moved the code in OnLButtonUp()(keeping the ReleaseCapture() call) to OnCaptureChanged(). As is, it looks like it works in the same exact way as before but has the 'safety' features you stated. Thanks again! Best Regards, Paul
-
Oh, I have to admit I missed that suggestion before but it makes perfect sense. I've moved the code in OnLButtonUp()(keeping the ReleaseCapture() call) to OnCaptureChanged(). As is, it looks like it works in the same exact way as before but has the 'safety' features you stated. Thanks again! Best Regards, Paul
Yourwelcome, again. :)
> The problem with computers is that they do what you tell them to do and not what you want them to do. < > Leela: Fry, you're wasting your life sitting in front of that TV. You need to get out and see the real world. Fry: But this is HDTV. It's got better resolution than the real world <