Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / UIAutomation / Win32Providers / MS / Internal / AutomationProxies / WindowsSpinner.cs / 1 / WindowsSpinner.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: Win32 Spinner Proxy // // History: // [....] // //--------------------------------------------------------------------------- using System; using System.Collections; using System.Text; using System.ComponentModel; using System.Windows.Automation; using System.Windows.Automation.Provider; using System.Windows; using MS.Win32; namespace MS.Internal.AutomationProxies { // Proxy for a Windows NumericUpDown control with Windows Edit control, called a Spinner class WindowsSpinner : ProxyHwnd, IRangeValueProvider { // ----------------------------------------------------- // // Constructors // // ----------------------------------------------------- #region Constructors // Contructor for WindownsSpinner class. Calls the base class constructor. internal WindowsSpinner(IntPtr hwndUpDown, IntPtr hwndEdit, ProxyFragment parent, int item) : base(hwndUpDown, parent, item) { _elEdit = new WindowsEditBox(hwndEdit, this, 0); _elUpDown = new WindowsUpDown(hwndUpDown, this, 0); // Set the strings to return properly the properties. _cControlType = ControlType.Spinner; // support for events _createOnEvent = new WinEventTracker.ProxyRaiseEvents(RaiseEvents); } #endregion Constructors #region Proxy Create // Static Create method called by UIAutomation to create this proxy. // returns null if unsuccessful internal static IRawElementProviderSimple Create(IntPtr hwnd, int idChild, int idObject) { return Create(hwnd, idChild); } internal static IRawElementProviderSimple Create(IntPtr hwnd, int idChild) { // Something is wrong if idChild is not zero if (idChild != 0) { System.Diagnostics.Debug.Assert (idChild == 0, "Invalid Child Id, idChild != 0"); throw new ArgumentOutOfRangeException("idChild", idChild, SR.Get(SRID.ShouldBeZero)); } IntPtr hwndBuddy; try { // Only use spinner class if we find a buddy that's an EDIT, otherwise return // null to defer to the WindowsUpDown entry in the proxy table hwndBuddy = Misc.ProxySendMessage(hwnd, NativeMethods.UDM_GETBUDDY, IntPtr.Zero, IntPtr.Zero); if (hwndBuddy == IntPtr.Zero) { return null; } if (Misc.ProxyGetClassName(hwndBuddy).IndexOf("EDIT", StringComparison.OrdinalIgnoreCase) == -1) { return null; } } catch (ElementNotAvailableException) { return null; } return new WindowsSpinner(hwnd, hwndBuddy, null, 0); } // Static Create method called by the event tracker system internal static void RaiseEvents(IntPtr hwnd, int eventId, object idProp, int idObject, int idChild) { if (idObject == NativeMethods.OBJID_VSCROLL || idObject == NativeMethods.OBJID_HSCROLL) { return; } // ChildId will be non-0 if the event is due to operating on the updown part of the spinner. // Events on non-content parts of a control are not necessary so don't raise an event in that case. if ( idChild != 0 ) { return; } ProxySimple ps = (ProxySimple)Create( hwnd, idChild, idObject ); if ( ps == null ) return; ps.DispatchEvents( eventId, idProp, idObject, idChild ); } #endregion Proxy Create //------------------------------------------------------ // // Patterns Implementation // //----------------------------------------------------- #region ProxySimple Interface // Returns a pattern interface if supported. internal override object GetPatternProvider (AutomationPattern iid) { return (iid == RangeValuePattern.Pattern) ? this : null; } // Gets the bounding rectangle for this element internal override Rect BoundingRectangle { get { Rect rcUpDown = _elUpDown.BoundingRectangle; Rect rcEdit = _elEdit.BoundingRectangle; return Rect.Union(rcEdit, rcUpDown); } } internal override object GetElementProperty(AutomationProperty idProp) { if (idProp == AutomationElement.ClickablePointProperty) { return _elEdit.GetElementProperty(idProp); } else if (idProp == AutomationElement.HasKeyboardFocusProperty) { return _elEdit.GetElementProperty(idProp); } return base.GetElementProperty(idProp); } #endregion ProxySimple Interface #region ProxyFragment Interface // Returns a Proxy element corresponding to the specified screen coordinates. internal override ProxySimple ElementProviderFromPoint(int x, int y) { Rect rcUpDown = _elUpDown.BoundingRectangle; Rect rcEdit = _elEdit.BoundingRectangle; Point pt = new Point(x, y); if (rcUpDown.Contains(pt)) { return _elUpDown.ElementProviderFromPoint(x, y); } else if (rcEdit.Contains(pt)) { return this; } return base.ElementProviderFromPoint(x, y); } // Returns the next sibling element in the raw hierarchy. // Peripheral controls have always negative values. // Returns null if no next child. internal override ProxySimple GetNextSibling(ProxySimple child) { return _elUpDown.GetNextSibling(child); } // Returns the previous sibling element in the raw hierarchy. // Peripheral controls have always negative values. // Returns null is no previous. internal override ProxySimple GetPreviousSibling(ProxySimple child) { return _elUpDown.GetPreviousSibling(child); } // Returns the first child element in the raw hierarchy. internal override ProxySimple GetFirstChild() { return _elUpDown.GetFirstChild(); } // Returns the last child element in the raw hierarchy. internal override ProxySimple GetLastChild() { return _elUpDown.GetLastChild(); } #endregion #region RangeValue Pattern // Sets a new position for the edit part of the spinner. void IRangeValueProvider.SetValue (double obj) { ((IRangeValueProvider)_elUpDown).SetValue(obj); } // Request to get the value that this UI element is representing in a native format double IRangeValueProvider.Value { get { return ((IRangeValueProvider)_elUpDown).Value; } } bool IRangeValueProvider.IsReadOnly { get { return (bool)((IRangeValueProvider)_elUpDown).IsReadOnly && (bool)((IValueProvider)_elEdit).IsReadOnly; } } double IRangeValueProvider.Maximum { get { return ((IRangeValueProvider) _elUpDown).Maximum; } } double IRangeValueProvider.Minimum { get { return ((IRangeValueProvider) _elUpDown).Minimum; } } double IRangeValueProvider.SmallChange { get { return ((IRangeValueProvider)_elUpDown).SmallChange; } } double IRangeValueProvider.LargeChange { get { return ((IRangeValueProvider)_elUpDown).LargeChange; } } #endregion RangeValuePattern // ------------------------------------------------------ // // Internal methods // // ------------------------------------------------------ #region Internal Methods // if there is an UpDown control that its buddy window is the same as the given edit hwnd // the edit is part of the spinner. internal static bool IsSpinnerEdit(IntPtr hwnd) { return GetUpDownFromEdit(hwnd) != IntPtr.Zero; } // Try to find a sibling of the edit control that is an UpDown control that has the // edit contol as its buddy window. If one is found return the hwnd of the UpDown control. internal static IntPtr GetUpDownFromEdit(IntPtr hwnd) { IntPtr hwndParent = Misc.GetParent(hwnd); if (hwndParent != IntPtr.Zero) { IntPtr hwndChild = Misc.GetWindow(hwndParent, NativeMethods.GW_CHILD); while (hwndChild != IntPtr.Zero) { string className = Misc.ProxyGetClassName(hwndChild); if (className.IndexOf("msctls_updown32", StringComparison.OrdinalIgnoreCase) != -1) { IntPtr hwndBuddy = Misc.ProxySendMessage(hwndChild, NativeMethods.UDM_GETBUDDY, IntPtr.Zero, IntPtr.Zero); if (hwnd == hwndBuddy) { return hwndChild; } } hwndChild = Misc.GetWindow(hwndChild, NativeMethods.GW_HWNDNEXT); } } return IntPtr.Zero; } #endregion Internal Methods // ----------------------------------------------------- // // Private Fields // // ------------------------------------------------------ #region Private Fields private WindowsEditBox _elEdit; private WindowsUpDown _elUpDown; #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: Win32 Spinner Proxy // // History: // [....] // //--------------------------------------------------------------------------- using System; using System.Collections; using System.Text; using System.ComponentModel; using System.Windows.Automation; using System.Windows.Automation.Provider; using System.Windows; using MS.Win32; namespace MS.Internal.AutomationProxies { // Proxy for a Windows NumericUpDown control with Windows Edit control, called a Spinner class WindowsSpinner : ProxyHwnd, IRangeValueProvider { // ----------------------------------------------------- // // Constructors // // ----------------------------------------------------- #region Constructors // Contructor for WindownsSpinner class. Calls the base class constructor. internal WindowsSpinner(IntPtr hwndUpDown, IntPtr hwndEdit, ProxyFragment parent, int item) : base(hwndUpDown, parent, item) { _elEdit = new WindowsEditBox(hwndEdit, this, 0); _elUpDown = new WindowsUpDown(hwndUpDown, this, 0); // Set the strings to return properly the properties. _cControlType = ControlType.Spinner; // support for events _createOnEvent = new WinEventTracker.ProxyRaiseEvents(RaiseEvents); } #endregion Constructors #region Proxy Create // Static Create method called by UIAutomation to create this proxy. // returns null if unsuccessful internal static IRawElementProviderSimple Create(IntPtr hwnd, int idChild, int idObject) { return Create(hwnd, idChild); } internal static IRawElementProviderSimple Create(IntPtr hwnd, int idChild) { // Something is wrong if idChild is not zero if (idChild != 0) { System.Diagnostics.Debug.Assert (idChild == 0, "Invalid Child Id, idChild != 0"); throw new ArgumentOutOfRangeException("idChild", idChild, SR.Get(SRID.ShouldBeZero)); } IntPtr hwndBuddy; try { // Only use spinner class if we find a buddy that's an EDIT, otherwise return // null to defer to the WindowsUpDown entry in the proxy table hwndBuddy = Misc.ProxySendMessage(hwnd, NativeMethods.UDM_GETBUDDY, IntPtr.Zero, IntPtr.Zero); if (hwndBuddy == IntPtr.Zero) { return null; } if (Misc.ProxyGetClassName(hwndBuddy).IndexOf("EDIT", StringComparison.OrdinalIgnoreCase) == -1) { return null; } } catch (ElementNotAvailableException) { return null; } return new WindowsSpinner(hwnd, hwndBuddy, null, 0); } // Static Create method called by the event tracker system internal static void RaiseEvents(IntPtr hwnd, int eventId, object idProp, int idObject, int idChild) { if (idObject == NativeMethods.OBJID_VSCROLL || idObject == NativeMethods.OBJID_HSCROLL) { return; } // ChildId will be non-0 if the event is due to operating on the updown part of the spinner. // Events on non-content parts of a control are not necessary so don't raise an event in that case. if ( idChild != 0 ) { return; } ProxySimple ps = (ProxySimple)Create( hwnd, idChild, idObject ); if ( ps == null ) return; ps.DispatchEvents( eventId, idProp, idObject, idChild ); } #endregion Proxy Create //------------------------------------------------------ // // Patterns Implementation // //----------------------------------------------------- #region ProxySimple Interface // Returns a pattern interface if supported. internal override object GetPatternProvider (AutomationPattern iid) { return (iid == RangeValuePattern.Pattern) ? this : null; } // Gets the bounding rectangle for this element internal override Rect BoundingRectangle { get { Rect rcUpDown = _elUpDown.BoundingRectangle; Rect rcEdit = _elEdit.BoundingRectangle; return Rect.Union(rcEdit, rcUpDown); } } internal override object GetElementProperty(AutomationProperty idProp) { if (idProp == AutomationElement.ClickablePointProperty) { return _elEdit.GetElementProperty(idProp); } else if (idProp == AutomationElement.HasKeyboardFocusProperty) { return _elEdit.GetElementProperty(idProp); } return base.GetElementProperty(idProp); } #endregion ProxySimple Interface #region ProxyFragment Interface // Returns a Proxy element corresponding to the specified screen coordinates. internal override ProxySimple ElementProviderFromPoint(int x, int y) { Rect rcUpDown = _elUpDown.BoundingRectangle; Rect rcEdit = _elEdit.BoundingRectangle; Point pt = new Point(x, y); if (rcUpDown.Contains(pt)) { return _elUpDown.ElementProviderFromPoint(x, y); } else if (rcEdit.Contains(pt)) { return this; } return base.ElementProviderFromPoint(x, y); } // Returns the next sibling element in the raw hierarchy. // Peripheral controls have always negative values. // Returns null if no next child. internal override ProxySimple GetNextSibling(ProxySimple child) { return _elUpDown.GetNextSibling(child); } // Returns the previous sibling element in the raw hierarchy. // Peripheral controls have always negative values. // Returns null is no previous. internal override ProxySimple GetPreviousSibling(ProxySimple child) { return _elUpDown.GetPreviousSibling(child); } // Returns the first child element in the raw hierarchy. internal override ProxySimple GetFirstChild() { return _elUpDown.GetFirstChild(); } // Returns the last child element in the raw hierarchy. internal override ProxySimple GetLastChild() { return _elUpDown.GetLastChild(); } #endregion #region RangeValue Pattern // Sets a new position for the edit part of the spinner. void IRangeValueProvider.SetValue (double obj) { ((IRangeValueProvider)_elUpDown).SetValue(obj); } // Request to get the value that this UI element is representing in a native format double IRangeValueProvider.Value { get { return ((IRangeValueProvider)_elUpDown).Value; } } bool IRangeValueProvider.IsReadOnly { get { return (bool)((IRangeValueProvider)_elUpDown).IsReadOnly && (bool)((IValueProvider)_elEdit).IsReadOnly; } } double IRangeValueProvider.Maximum { get { return ((IRangeValueProvider) _elUpDown).Maximum; } } double IRangeValueProvider.Minimum { get { return ((IRangeValueProvider) _elUpDown).Minimum; } } double IRangeValueProvider.SmallChange { get { return ((IRangeValueProvider)_elUpDown).SmallChange; } } double IRangeValueProvider.LargeChange { get { return ((IRangeValueProvider)_elUpDown).LargeChange; } } #endregion RangeValuePattern // ------------------------------------------------------ // // Internal methods // // ------------------------------------------------------ #region Internal Methods // if there is an UpDown control that its buddy window is the same as the given edit hwnd // the edit is part of the spinner. internal static bool IsSpinnerEdit(IntPtr hwnd) { return GetUpDownFromEdit(hwnd) != IntPtr.Zero; } // Try to find a sibling of the edit control that is an UpDown control that has the // edit contol as its buddy window. If one is found return the hwnd of the UpDown control. internal static IntPtr GetUpDownFromEdit(IntPtr hwnd) { IntPtr hwndParent = Misc.GetParent(hwnd); if (hwndParent != IntPtr.Zero) { IntPtr hwndChild = Misc.GetWindow(hwndParent, NativeMethods.GW_CHILD); while (hwndChild != IntPtr.Zero) { string className = Misc.ProxyGetClassName(hwndChild); if (className.IndexOf("msctls_updown32", StringComparison.OrdinalIgnoreCase) != -1) { IntPtr hwndBuddy = Misc.ProxySendMessage(hwndChild, NativeMethods.UDM_GETBUDDY, IntPtr.Zero, IntPtr.Zero); if (hwnd == hwndBuddy) { return hwndChild; } } hwndChild = Misc.GetWindow(hwndChild, NativeMethods.GW_HWNDNEXT); } } return IntPtr.Zero; } #endregion Internal Methods // ----------------------------------------------------- // // Private Fields // // ------------------------------------------------------ #region Private Fields private WindowsEditBox _elEdit; private WindowsUpDown _elUpDown; #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SettingsPropertyIsReadOnlyException.cs
- Debug.cs
- ExpressionHelper.cs
- MatrixTransform.cs
- ExpandedProjectionNode.cs
- ImageListStreamer.cs
- ResourceAttributes.cs
- WhiteSpaceTrimStringConverter.cs
- DocumentXmlWriter.cs
- ADMembershipProvider.cs
- MissingMethodException.cs
- SqlCommandSet.cs
- RelatedPropertyManager.cs
- WebCodeGenerator.cs
- LicenseProviderAttribute.cs
- ElementMarkupObject.cs
- ObjectIDGenerator.cs
- _Win32.cs
- SystemIPAddressInformation.cs
- TrustManagerMoreInformation.cs
- parserscommon.cs
- IISMapPath.cs
- TypeConverterHelper.cs
- ArrayWithOffset.cs
- CodeAccessSecurityEngine.cs
- MetaForeignKeyColumn.cs
- ConstructorExpr.cs
- TypeSystemProvider.cs
- RelationshipFixer.cs
- SymDocumentType.cs
- SoapTypeAttribute.cs
- FragmentNavigationEventArgs.cs
- SqlTriggerAttribute.cs
- Line.cs
- FormView.cs
- Attributes.cs
- ScrollProperties.cs
- RightsManagementInformation.cs
- EmptyEnumerator.cs
- DesignerActionVerbItem.cs
- ComponentManagerBroker.cs
- SuppressMessageAttribute.cs
- DataObjectPastingEventArgs.cs
- TrustManagerPromptUI.cs
- HtmlHistory.cs
- XmlSchemaObject.cs
- MeshGeometry3D.cs
- TransformedBitmap.cs
- PolicyManager.cs
- TextAdaptor.cs
- UIAgentAsyncParams.cs
- VScrollBar.cs
- IsolatedStorageException.cs
- EventHandlersStore.cs
- GridViewDeleteEventArgs.cs
- XsltException.cs
- LocalizeDesigner.cs
- GifBitmapDecoder.cs
- ResourceExpressionBuilder.cs
- ClientBuildManagerCallback.cs
- NamespaceListProperty.cs
- ConnectionManagementElement.cs
- XPathSingletonIterator.cs
- NonClientArea.cs
- KoreanLunisolarCalendar.cs
- VectorValueSerializer.cs
- TrustManagerPromptUI.cs
- SecurityException.cs
- SignedXml.cs
- FileStream.cs
- ConfigurationPermission.cs
- DataStorage.cs
- XmlAttributeCache.cs
- HtmlControlPersistable.cs
- MediaTimeline.cs
- HMACSHA1.cs
- WorkItem.cs
- Int32Storage.cs
- StateFinalizationDesigner.cs
- SocketSettings.cs
- FamilyTypefaceCollection.cs
- ReverseInheritProperty.cs
- TextEditorParagraphs.cs
- BindingExpressionBase.cs
- ArithmeticLiteral.cs
- CssStyleCollection.cs
- HtmlControlPersistable.cs
- _RequestCacheProtocol.cs
- HtmlContainerControl.cs
- SecurityIdentifierElement.cs
- CachedBitmap.cs
- PrintSystemException.cs
- XmlHierarchicalEnumerable.cs
- EventEntry.cs
- FilterableAttribute.cs
- EnumMember.cs
- InternalConfigRoot.cs
- DbExpressionBuilder.cs
- UserControlAutomationPeer.cs
- PasswordRecovery.cs