Detect MouseUp after Leaving MouseDown Control - vb.net

Using VB.NET, Short of adding a mouseup event to every control in my form, does anybody know a way to trigger a mouseup event regardless of where the cursor is located or what control the cursor is in?
Or is there a way to see if the mouse left button is up, that way I can do on enter, if mouseup then...

Or is there a way to see if the mouse left button is up, that way I can do on enter, if mouseup then...
There is a static property on the Control class - Control.MouseButtons which returns, in the form of a flag based enum, which buttons on the mouse are currently pressed.
var pressedButtons = Control.MouseButtons;
if (!pressedButtons.HasFlag(MouseButtons.Left))
{
// Left mouse button is not down, so do stuff
}

Related

Adding event handlers to object

Is there a way to add keydown and keyleft event handler to image object in a user form? I can only see mouseup/down/move,error,dragover,dropandpaste.
I notice with an option button, the event keydown/keyleft is available but not for image.
Thanks in advance
You can't add event handlers that don't exist for that control type (other than by subclassing, but the image control doesn't receive focus anyway), but an image control can't receive the focus, and therefore can't receive keystrokes anyway.
You talk about KeyDown and KeyLeft events. While some controls have KeyDown, KeyPress and KeyUp events, there aren't any controls that have a KeyLeft event. Do you perhaps mean to capture the KeyDown event, and then detect whether the Down arrow or Left arrow was the key that pressed down?
However, there are a few options:
Wire up the KeyDown or KeyPress event (depending upon which type of key information you require) for the UserForm, and then act upon the image control. This is probably only of use if you're happy for keypresses to be handled by the form, regardless of which other control might be selected.
Add a proxy control, say a TextBox that does receive KeyDown and KeyPress events, and place it behind the image control. That way, when the user tabs to the textbox, you can add a border to the image to make it look like it is selected, and then have the textbox key events act upon the image. If a user clicks on the image, instead of tabbing between controls, you can set the image's click event to give the textbox the focus, and again, handle the key events for the textbox as a proxy for the image control.
It depends on what are you trying to achieve which you didn't specify.
Image obviously doesn't have Key-events so it can't be used directly.
One possible solution could be to use Frame control which has a Picture property and has KeyDown event, so you can catch key-downs when the frame has focus. Example:
Private Sub FrameWithPicture_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
' Compare KeyCode with predefined vbKey-Constansts, e.g. for key-left:
If KeyCode = vbKeyLeft Then
' left arrow key was pressed, do somthing
Else
' all other keys were pressed, do something else
End If
End Sub
Or you could add Image control to this frame and when key-down event occurs on the frame, then perform some action on this image like this: FrameWithImage.Controls.Item(0).BackColor = vbRed etc. HTH

How can I get mouse location on a button?

VB.NET
Visual Studio
I have several buttons that I add at runtime, and I have a MouseDown event handler for the click event. Left click works just fine, but the right click event fires, but doesn't do what I need it to.
If e.Button = Windows.Forms.MouseButtons.Right Then
If sender.Bounds.Contains(e.Location) = True Then
ContextMenuStrip.Show(Cursor.Position)
End If
End If
I shortened this to make it easier to read.
When I look at e.Location, it shows the mouse location in relation to the button.
So if my button is at 400, 600, the location of the mouse should be in that area, but the mouse location comes back with 20, 30 because it is at 20,30 inside the button.
How can I do this right click event properly?
MouseDown event raises when the mouse is down on your control, so the mouse is surely in your control bounds and you don't need to check if the button contains e.Location.
To show the context menu strip, if you assign the context menu strip to ContextMenuStrip property of your control, then you don't need to do anything and the menu will show automatically. But if for any reason you want to handle MouseDown event, you can use either of these options:
ContextMenuStrip1.Show(DirectCast(sender, Control), e.Location)
ContextMenuStrip1.Show(MousePosition)
Note: Just for learning purpose if you want to check if e.Location is in your button, you can use either of these options:
Button1.ClientRectangle.Contains(e.Location)
Button1.Bounds.Contains(Button1.Parent.PointToClient(Button1.PointToScreen(e.Location)))
Or some other combinations using PointToClient, PointToScreen, RectangleToClient, RectangleToScreen methods of controls.

How would I differentiate from Click and Double Click while using a C1FlexGrid

I want to use the double click and click events for c1flexgrid in vb.net, but when I double click it only goes to the click event handler and never fires the double click event.
How can I separately handle the click and double click events?
As stated in MSDN :
Pressing a mouse button when the cursor is over any particular clickable control raises the events in following order:
MouseDown event.
Click event.
MouseClick event.
MouseUp event.
MouseDown event.
DoubleClick event.
MouseDoubleClick event.
MouseUp event.
Two single clicks that occur close enough in time, as determined by the mouse settings of the user's operating system, will generate a MouseDoubleClick event instead of the second MouseClick event.
Therefore,
Check your mouse settings.

TileControl.ItemClick event vs TileControl.ItemPress event

I'm trying to figure out what the difference of a click and a press event on a devexpress tile control is.
According to the online documentation:
TileControl.ItemClick Event Fires when an end-user clicks a TileItem
within the TileControl.
...
Remarks
Handle the ItemClick event to respond to an end-user clicking any item
within the current TileControl object. You can also use handle the
TileItem.ItemClick event to respond to clicking an individual
TileItem. This event can be raised in code via the
TileItem.PerformItemClick method. The TileItem.ItemClick event is
fired before the ItemClick event.
The ItemClick event comes after the ItemPress event when the left
mouse button is released. If an item is being dragged, the ItemClick
event is never fired.
' ' ' ' ' ' ' ' ' ' '
TileControl.ItemPress Event Fires when an end-user presses a TileItem within the current
TileControl.
...
Remarks
Tile items have two event types to respond to an end-user clicking
them at runtime: item press and item click events. Immediately after
an end-user clicks a tile item, tile item press events are fired.
First, the TileItem.ItemPress event is raised. After that, the
ItemPress event is fired.
This is probably very obvious to a more experienced developer but I'm very confused about this and don't understand when to use click/press. When should I use "ItemPress"?
in vb.net when a control is clicked, it means that you have fired two events, the mousedown and the mouseup event and i think, in your case, and as mentioned in the documentation, ItemClick Remark int last section:
The ItemClick event comes after the ItemPress event when the left
mouse button is released. If an item is being dragged, the
ItemClick event is never fired.
when you release the mouse left button after pressing it, and if you have not dragged the Tile Item an Itemclick event will be fired, else the ItemPress event will be pressed.

Missing mouse up event from different canvas in smartGWT

I have two canvases located to each other. One is supposed to be a kind of workspace you can add items to, select and rearange them. The other one is just a property view.
What I want to do is to be able to draw a rectrangle on the workspace. As long as the user holds down the mouse button the rectangle will show up. If he releases the button all items that are beneath the rectangle will be selected. This currently works good with the MouseDown, MouseStillDown und MouseUp events. I'm drawing another rectangle shaed canvas on the workspace which will be transformed on every MouseStillDown event and the selection will occur on the MouseUp event. My problem is, that if the user hold down the mouse button and moves it to the property canvas and then releases the button the MouseUp event from the workspace isn't called. Neither is the one from the property since it's missing a MouseDown event. So if the user releases the button there the selection won't work and the rectangle stays in the workspace.
Is there an oppurtunity to somehow avoid this? Or is there a better way to determine the area the user selected with it's mouse while holding down the left mouse button?