private void Button_OnMouseDown(object sender, MouseButtonEventArgs args) { if (!clicking && !Disabled) { clicking = true; pressed = true; ConsoleApplication.Instance.BeginCaptureInput(this); this.Invalidate(); args.Handled = true; } }
private void OnMouseDown(object sender, MouseButtonEventArgs args) { Point point = args.GetPosition(this); if (point.X > 0 && point.X - 1 < getSize( )) { int x = point.X - 1; if (!String.IsNullOrEmpty(text)) { if (x <= text.Length) cursorPosition = x; else { cursorPosition = text.Length; } CursorPosition = new Point(cursorPosition + 1, 0); } args.Handled = true; } }
private bool processRoutedEvent(RoutedEvent routedEvent, RoutedEventArgs args) { // List<RoutedEventTargetInfo> subscribedTargets = getTargetsSubscribedTo(routedEvent); Control capturingControl = inputCaptureStack.Count != 0 ? inputCaptureStack.Peek() : null; // if (routedEvent.RoutingStrategy == RoutingStrategy.Direct) { if (null == subscribedTargets) return false; // RoutedEventTargetInfo targetInfo = subscribedTargets.FirstOrDefault(info => info.target == args.Source); if (null == targetInfo) return false; // если имеется контрол, захватывающий события, события получает только он сам // и его дочерние контролы if ( capturingControl != null ) { if ( !(args.Source is Control) ) return false; if ( !isControlAllowedToReceiveEvents( ( Control ) args.Source, capturingControl ) ) return false; } // copy handlersList to local list to avoid modifications when enumerating foreach (DelegateInfo delegateInfo in new List< DelegateInfo >(targetInfo.handlersList)) { if (!args.Handled || delegateInfo.handledEventsToo) { if (delegateInfo.@delegate is RoutedEventHandler) { ((RoutedEventHandler) delegateInfo.@delegate).Invoke(targetInfo.target, args); } else { [email protected](targetInfo.target, args); } } } } Control source = (Control) args.Source; // path to source from root element down to Source List<Control> path = new List<Control>(); Control current = source; while (null != current) { // та же логика с контролом, захватившим обработку сообщений // если имеется контрол, захватывающий события, события получает только он сам // и его дочерние контролы if ( capturingControl == null || isControlAllowedToReceiveEvents( current, capturingControl ) ) { path.Insert( 0, current ); current = current.Parent; } else { break; } } if (routedEvent.RoutingStrategy == RoutingStrategy.Tunnel) { if (subscribedTargets != null) { foreach (Control potentialTarget in path) { Control target = potentialTarget; RoutedEventTargetInfo targetInfo = subscribedTargets.FirstOrDefault(info => info.target == target); if (null != targetInfo) { foreach (DelegateInfo delegateInfo in new List< DelegateInfo >(targetInfo.handlersList)) { if (!args.Handled || delegateInfo.handledEventsToo) { if (delegateInfo.@delegate is RoutedEventHandler) { ((RoutedEventHandler) delegateInfo.@delegate).Invoke(target, args); } else { [email protected](target, args); } } } } } } // для парных Preview-событий запускаем соответствующие настоящие события, // сохраняя при этом Handled (если Preview событие помечено как Handled=true, // то и настоящее событие будет маршрутизировано с Handled=true) if (routedEvent == Control.PreviewMouseDownEvent) { MouseButtonEventArgs mouseArgs = ( ( MouseButtonEventArgs ) args ); MouseButtonEventArgs argsNew = new MouseButtonEventArgs( args.Source, Control.MouseDownEvent, mouseArgs.RawPosition, mouseArgs.LeftButton, mouseArgs.MiddleButton, mouseArgs.RightButton, mouseArgs.ChangedButton ); argsNew.Handled = args.Handled; eventsQueue.Enqueue(argsNew); } if (routedEvent == Control.PreviewMouseUpEvent) { MouseButtonEventArgs mouseArgs = ( ( MouseButtonEventArgs ) args ); MouseButtonEventArgs argsNew = new MouseButtonEventArgs( args.Source, Control.MouseUpEvent, mouseArgs.RawPosition, mouseArgs.LeftButton, mouseArgs.MiddleButton, mouseArgs.RightButton, mouseArgs.ChangedButton ); argsNew.Handled = args.Handled; eventsQueue.Enqueue(argsNew); } if (routedEvent == Control.PreviewMouseMoveEvent) { MouseEventArgs mouseArgs = ( ( MouseEventArgs ) args ); MouseEventArgs argsNew = new MouseEventArgs( args.Source, Control.MouseMoveEvent, mouseArgs.RawPosition, mouseArgs.LeftButton, mouseArgs.MiddleButton, mouseArgs.RightButton ); argsNew.Handled = args.Handled; eventsQueue.Enqueue(argsNew); } if ( routedEvent == Control.PreviewMouseWheelEvent ) { MouseWheelEventArgs oldArgs = ((MouseWheelEventArgs)args); MouseEventArgs argsNew = new MouseWheelEventArgs( args.Source, Control.MouseWheelEvent, oldArgs.RawPosition, oldArgs.LeftButton, oldArgs.MiddleButton, oldArgs.RightButton, oldArgs.Delta ); argsNew.Handled = args.Handled; eventsQueue.Enqueue(argsNew); } if (routedEvent == Control.PreviewKeyDownEvent) { KeyEventArgs argsNew = new KeyEventArgs(args.Source, Control.KeyDownEvent); KeyEventArgs keyEventArgs = ( ( KeyEventArgs ) args ); argsNew.UnicodeChar = keyEventArgs.UnicodeChar; argsNew.bKeyDown = keyEventArgs.bKeyDown; argsNew.dwControlKeyState = keyEventArgs.dwControlKeyState; argsNew.wRepeatCount = keyEventArgs.wRepeatCount; argsNew.wVirtualKeyCode = keyEventArgs.wVirtualKeyCode; argsNew.wVirtualScanCode = keyEventArgs.wVirtualScanCode; argsNew.Handled = args.Handled; eventsQueue.Enqueue(argsNew); } if (routedEvent == Control.PreviewKeyUpEvent) { KeyEventArgs argsNew = new KeyEventArgs(args.Source, Control.KeyUpEvent); KeyEventArgs keyEventArgs = ( ( KeyEventArgs ) args ); argsNew.UnicodeChar = keyEventArgs.UnicodeChar; argsNew.bKeyDown = keyEventArgs.bKeyDown; argsNew.dwControlKeyState = keyEventArgs.dwControlKeyState; argsNew.wRepeatCount = keyEventArgs.wRepeatCount; argsNew.wVirtualKeyCode = keyEventArgs.wVirtualKeyCode; argsNew.wVirtualScanCode = keyEventArgs.wVirtualScanCode; argsNew.Handled = args.Handled; eventsQueue.Enqueue(argsNew); } } if (routedEvent.RoutingStrategy == RoutingStrategy.Bubble) { if (subscribedTargets != null) { for (int i = path.Count - 1; i >= 0; i--) { Control target = path[i]; RoutedEventTargetInfo targetInfo = subscribedTargets.FirstOrDefault(info => info.target == target); if (null != targetInfo) { // foreach (DelegateInfo delegateInfo in new List< DelegateInfo >(targetInfo.handlersList)) { if (!args.Handled || delegateInfo.handledEventsToo) { if (delegateInfo.@delegate is RoutedEventHandler) { ((RoutedEventHandler) delegateInfo.@delegate).Invoke(target, args); } else { [email protected](target, args); } } } } } } } return args.Handled; }
public void ParseInputEvent(INPUT_RECORD inputRecord, Control rootElement) { if (inputRecord.EventType == EventType.MOUSE_EVENT) { MOUSE_EVENT_RECORD mouseEvent = inputRecord.MouseEvent; if (mouseEvent.dwEventFlags != MouseEventFlags.PRESSED_OR_RELEASED && mouseEvent.dwEventFlags != MouseEventFlags.MOUSE_MOVED && mouseEvent.dwEventFlags != MouseEventFlags.DOUBLE_CLICK && mouseEvent.dwEventFlags != MouseEventFlags.MOUSE_WHEELED && mouseEvent.dwEventFlags != MouseEventFlags.MOUSE_HWHEELED) { // throw new InvalidOperationException("Flags combination in mouse event was not expected."); } Point rawPosition; if (mouseEvent.dwEventFlags == MouseEventFlags.MOUSE_MOVED || mouseEvent.dwEventFlags == MouseEventFlags.PRESSED_OR_RELEASED) { rawPosition = new Point(mouseEvent.dwMousePosition.X, mouseEvent.dwMousePosition.Y); lastMousePosition = rawPosition; } else { // При событии MOUSE_WHEELED в Windows некорректно устанавливается mouseEvent.dwMousePosition // Поэтому для определения элемента, над которым производится прокручивание колёсика, мы // вынуждены сохранять координаты, полученные при предыдущем событии мыши rawPosition = lastMousePosition; } Control topMost = findSource(rawPosition, rootElement); // если мышь захвачена контролом, то события перемещения мыши доставляются только ему, // события, связанные с нажатием мыши - тоже доставляются только ему, вместо того // контрола, над которым событие было зарегистрировано. Такой механизм необходим, // например, для корректной обработки перемещений окон (вверх или в стороны) Control source = (inputCaptureStack.Count != 0) ? inputCaptureStack.Peek() : topMost; if (mouseEvent.dwEventFlags == MouseEventFlags.MOUSE_MOVED) { MouseButtonState leftMouseButtonState = getLeftButtonState(mouseEvent.dwButtonState); MouseButtonState middleMouseButtonState = getMiddleButtonState(mouseEvent.dwButtonState); MouseButtonState rightMouseButtonState = getRightButtonState(mouseEvent.dwButtonState); // MouseEventArgs mouseEventArgs = new MouseEventArgs(source, Control.PreviewMouseMoveEvent, rawPosition, leftMouseButtonState, middleMouseButtonState, rightMouseButtonState ); eventsQueue.Enqueue(mouseEventArgs); // lastLeftMouseButtonState = leftMouseButtonState; lastMiddleMouseButtonState = middleMouseButtonState; lastRightMouseButtonState = rightMouseButtonState; // detect mouse enter / mouse leave events // path to source from root element down List<Control> mouseOverStack = new List<Control>(); Control current = topMost; while (null != current) { mouseOverStack.Insert(0, current); current = current.Parent; } int index; for (index = 0; index < Math.Min(mouseOverStack.Count, prevMouseOverStack.Count); index++) { if (mouseOverStack[index] != prevMouseOverStack[index]) break; } for (int i = prevMouseOverStack.Count - 1; i >= index; i-- ) { Control control = prevMouseOverStack[i]; MouseEventArgs args = new MouseEventArgs(control, Control.MouseLeaveEvent, rawPosition, leftMouseButtonState, middleMouseButtonState, rightMouseButtonState ); eventsQueue.Enqueue(args); } for (int i = index; i < mouseOverStack.Count; i++ ) { // enqueue MouseEnter event Control control = mouseOverStack[i]; MouseEventArgs args = new MouseEventArgs(control, Control.MouseEnterEvent, rawPosition, leftMouseButtonState, middleMouseButtonState, rightMouseButtonState ); eventsQueue.Enqueue(args); } prevMouseOverStack.Clear(); prevMouseOverStack.AddRange(mouseOverStack); } if (mouseEvent.dwEventFlags == MouseEventFlags.PRESSED_OR_RELEASED) { // MouseButtonState leftMouseButtonState = getLeftButtonState(mouseEvent.dwButtonState); MouseButtonState middleMouseButtonState = getMiddleButtonState(mouseEvent.dwButtonState); MouseButtonState rightMouseButtonState = getRightButtonState(mouseEvent.dwButtonState); // if (leftMouseButtonState != lastLeftMouseButtonState) { MouseButtonEventArgs eventArgs = new MouseButtonEventArgs(source, leftMouseButtonState == MouseButtonState.Pressed ? Control.PreviewMouseDownEvent : Control.PreviewMouseUpEvent, rawPosition, leftMouseButtonState, lastMiddleMouseButtonState, lastRightMouseButtonState, MouseButton.Left ); eventsQueue.Enqueue(eventArgs); } if (middleMouseButtonState != lastMiddleMouseButtonState) { MouseButtonEventArgs eventArgs = new MouseButtonEventArgs(source, middleMouseButtonState == MouseButtonState.Pressed ? Control.PreviewMouseDownEvent : Control.PreviewMouseUpEvent, rawPosition, lastLeftMouseButtonState, middleMouseButtonState, lastRightMouseButtonState, MouseButton.Middle ); eventsQueue.Enqueue(eventArgs); } if (rightMouseButtonState != lastRightMouseButtonState) { MouseButtonEventArgs eventArgs = new MouseButtonEventArgs(source, rightMouseButtonState == MouseButtonState.Pressed ? Control.PreviewMouseDownEvent : Control.PreviewMouseUpEvent, rawPosition, lastLeftMouseButtonState, lastMiddleMouseButtonState, rightMouseButtonState, MouseButton.Right ); eventsQueue.Enqueue(eventArgs); } // lastLeftMouseButtonState = leftMouseButtonState; lastMiddleMouseButtonState = middleMouseButtonState; lastRightMouseButtonState = rightMouseButtonState; } if (mouseEvent.dwEventFlags == MouseEventFlags.MOUSE_WHEELED) { MouseWheelEventArgs args = new MouseWheelEventArgs( topMost, Control.PreviewMouseWheelEvent, rawPosition, lastLeftMouseButtonState, lastMiddleMouseButtonState, lastRightMouseButtonState, mouseEvent.dwButtonState > 0 ? 1 : -1 ); eventsQueue.Enqueue( args ); } } if (inputRecord.EventType == EventType.KEY_EVENT) { KEY_EVENT_RECORD keyEvent = inputRecord.KeyEvent; KeyEventArgs eventArgs = new KeyEventArgs( ConsoleApplication.Instance.FocusManager.FocusedElement, keyEvent.bKeyDown ? Control.PreviewKeyDownEvent : Control.PreviewKeyUpEvent); eventArgs.UnicodeChar = keyEvent.UnicodeChar; eventArgs.bKeyDown = keyEvent.bKeyDown; eventArgs.dwControlKeyState = keyEvent.dwControlKeyState; eventArgs.wRepeatCount = keyEvent.wRepeatCount; eventArgs.wVirtualKeyCode = keyEvent.wVirtualKeyCode; eventArgs.wVirtualScanCode = keyEvent.wVirtualScanCode; eventsQueue.Enqueue(eventArgs); } }
private void OnMouseDown( object sender, MouseButtonEventArgs args ) { Point pos = args.GetPosition( this ); if ( horizontalScrollVisible ) { Point leftArrowPos = new Point( 0, ActualHeight - 1 ); Point rightArrowPos = new Point( ActualWidth - ( 1 + ( verticalScrollVisible ? 1 : 0 ) ), ActualHeight - 1 ); if ( leftArrowPos == pos ) { if (deltaX > 0) { deltaX--; Invalidate(); } } else if ( rightArrowPos == pos ) { // сколько места сейчас оставлено дочернему контролу int remainingWidth = ActualWidth - ( verticalScrollVisible ? 1 : 0 ); if ( deltaX < Content.RenderSize.Width - remainingWidth ) { deltaX++; Invalidate( ); } } else if ( pos.Y == ActualHeight - 1 ) { // Clicked somewhere in scrollbar Point? horizontalScrollerPos = HorizontalScrollerPos; if ( horizontalScrollerPos.HasValue ) { int remainingWidth = ActualWidth - ( verticalScrollVisible ? 1 : 0 ); int itemsPerScrollerPos = Content.RenderSize.Width/remainingWidth; if ( pos.X < horizontalScrollerPos.Value.X ) { deltaX = Math.Max( 0, deltaX - itemsPerScrollerPos ); Invalidate( ); } else if ( pos.X > horizontalScrollerPos.Value.X ) { deltaX = Math.Min(Content.RenderSize.Width - remainingWidth, deltaX + itemsPerScrollerPos); Invalidate(); } else { // Click on scroller // todo : make scroller draggable } } } } if ( verticalScrollVisible ) { Point upArrowPos = new Point( ActualWidth - 1, 0 ); Point downArrowPos = new Point( ActualWidth - 1, ActualHeight - ( 1 + ( horizontalScrollVisible ? 1 : 0 ) ) ); if ( pos == upArrowPos ) { if (deltaY > 0) { deltaY--; Invalidate(); } } else if ( pos == downArrowPos ) { // сколько места сейчас оставлено дочернему контролу int remainingHeight = ActualHeight - ( horizontalScrollVisible ? 1 : 0 ); if ( deltaY < Content.RenderSize.Height - remainingHeight ) { deltaY++; Invalidate( ); } } else if ( pos.X == ActualWidth - 1 ) { // Clicked somewhere in scrollbar Point? verticalScrollerPos = VerticalScrollerPos; if ( verticalScrollerPos.HasValue ) { int remainingHeight = ActualHeight - ( horizontalScrollVisible ? 1 : 0 ); int itemsPerScrollerPos = Content.RenderSize.Height/remainingHeight; if ( pos.Y < verticalScrollerPos.Value.Y ) { deltaY = Math.Max( 0, deltaY - itemsPerScrollerPos ); Invalidate( ); } else if ( pos.Y > verticalScrollerPos.Value.Y ) { deltaY = Math.Min(Content.RenderSize.Height - remainingHeight, deltaY + itemsPerScrollerPos); Invalidate(); } else { // Click on scroller // todo : make scroller draggable } } } } args.Handled = true; }
/// <summary> /// По клику мышки ищет конечный Focusable контрол, который размещён /// на месте нажатия и устанавливает на нём фокус. /// </summary> private void Window_OnPreviewMouseDown(object sender, MouseButtonEventArgs e) { PassFocusToChildUnderPoint( e ); }
public void Window_OnMouseUp(object sender, MouseButtonEventArgs args) { if (closing) { Point point = args.GetPosition(this); if (point.x == 3 && point.y == 0) { getWindowsHost().CloseWindow(this); } closing = false; showClosingGlyph = false; ConsoleApplication.Instance.EndCaptureInput(this); Invalidate(); args.Handled = true; } if (moving) { moving = false; ConsoleApplication.Instance.EndCaptureInput(this); Invalidate(); args.Handled = true; } if (resizing) { resizing = false; ConsoleApplication.Instance.EndCaptureInput(this); Invalidate(); args.Handled = true; } }
public void Window_OnMouseDown(object sender, MouseButtonEventArgs args) { // перемещение можно начинать только когда окно не ресайзится и наоборот if (!moving && !resizing && !closing) { Point point = args.GetPosition(this); Point parentPoint = args.GetPosition(getWindowsHost()); if (point.y == 0 && point.x == 3) { closing = true; showClosingGlyph = true; ConsoleApplication.Instance.BeginCaptureInput(this); // closing is started, we should redraw the border Invalidate(); args.Handled = true; } else if (point.y == 0) { moving = true; movingStartPoint = parentPoint; movingStartX = RenderSlotRect.TopLeft.X; movingStartY = RenderSlotRect.TopLeft.Y; ConsoleApplication.Instance.BeginCaptureInput(this); // moving is started, we should redraw the border Invalidate(); args.Handled = true; } else if (point.x == ActualWidth - 3 && point.y == ActualHeight - 2) { resizing = true; resizingStartPoint = parentPoint; resizingStartWidth = ActualWidth; resizingStartHeight = ActualHeight; ConsoleApplication.Instance.BeginCaptureInput(this); // resizing is started, we should redraw the border Invalidate(); args.Handled = true; } } }
private void OnMouseDown( object sender, MouseButtonEventArgs args ) { int index = args.GetPosition( this ).Y; if ( !disabledItemsIndexes.Contains(index) && SelectedItemIndex != index) { SelectedItemIndex = index; Invalidate( ); } if (disabledItemsIndexes.Contains( index )) args.Handled = true; }
private void OnMouseDown( object sender, MouseButtonEventArgs mouseButtonEventArgs ) { if ( !opened ) openPopup( ); }
private void OnMouseDown( object sender, MouseButtonEventArgs args ) { Point pos = args.GetPosition( this ); if ( horizontalScrollVisible ) { if ( pos == new Point( 0, ActualHeight - 1 ) ) { // left arrow clicked if (deltaX > 0) { deltaX--; Invalidate(); } } else { if ( pos == new Point( ActualWidth - ( 1 + ( verticalScrollVisible ? 1 : 0 ) ), ActualHeight - 1 ) ) { // right arrow clicked // сколько места сейчас оставлено дочернему контролу int remainingWidth = ActualWidth - (verticalScrollVisible ? 1 : 0); if (deltaX < Content.RenderSize.Width - remainingWidth) { deltaX++; Invalidate(); } } } } if ( verticalScrollVisible ) { if ( pos == new Point( ActualWidth - 1, 0 ) ) { // up arrow clicked if (deltaY > 0) { deltaY--; Invalidate(); } } else { if ( pos == new Point( ActualWidth - 1, ActualHeight - ( 1 + ( horizontalScrollVisible ? 1 : 0 ) ) ) ) { // down arrow clicked // сколько места сейчас оставлено дочернему контролу int remainingHeight = ActualHeight - (horizontalScrollVisible ? 1 : 0); if (deltaY < Content.RenderSize.Height - remainingHeight) { deltaY++; Invalidate(); } } } } args.Handled = true; }
private void Button_OnMouseUp(object sender, MouseButtonEventArgs args) { if (clicking && !Disabled) { clicking = false; if (pressed) { pressed = false; this.Invalidate(); } if (HitTest(args.RawPosition)) { RaiseEvent(ClickEvent, new RoutedEventArgs(this, ClickEvent)); if (command != null && command.CanExecute(CommandParameter)) { command.Execute(CommandParameter); } } ConsoleApplication.Instance.EndCaptureInput(this); args.Handled = true; } }
private void stopAutoRepeatTimer( ) { timer.Dispose( ); timer = null; autoRepeatTimerRunning = false; lastMousePressEventArgs = null; }
private void startAutoRepeatTimer( MouseButtonEventArgs eventArgs ) { lastMousePressEventArgs = eventArgs; timer = new Timer( state => { ConsoleApplication.Instance.RunOnUiThread( ( ) => { if (autoRepeatTimerRunning) { eventsQueue.Enqueue( new MouseButtonEventArgs( lastMousePressEventArgs.Source, Control.MouseDownEvent, lastMousePosition, lastMousePressEventArgs.LeftButton, lastMousePressEventArgs.MiddleButton, lastMousePressEventArgs.RightButton, MouseButton.Left, 1, true ) ); } } ); // todo : make this constants configurable }, null, TimeSpan.FromMilliseconds( 300 ), TimeSpan.FromMilliseconds(100) ); autoRepeatTimerRunning = true; }
private void mouseDown( object sender, MouseButtonEventArgs args ) { Point pos = args.GetPosition( this ); if ( pos.y > 2 ) return; int x = 0; for ( int i = 0; i < tabDefinitions.Count; i++ ) { TabDefinition tabDefinition = tabDefinitions[ i ]; if ( pos.X > x && pos.X <= x + tabDefinition.Title.Length + 2 ) { activeTabIndex = i; Invalidate( ); break; } x += tabDefinition.Title.Length + 2 + 1; // Two spaces around + one vertical border } args.Handled = true; }