Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / WinForms / System / WinForms / Design / Behavior / GrabHandleGlyph.cs / 1 / GrabHandleGlyph.cs
namespace System.Windows.Forms.Design.Behavior { using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Design; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms.Design; using System.Runtime.InteropServices; ////// /// The GrabHandleGlyph represents the 8 handles of our new seleciton /// model. Note that the pen and brush are created once per instance of this class /// and re-used in our painting logic for perf. reasonse. /// internal class GrabHandleGlyph : SelectionGlyphBase { private bool isPrimary = false; ////// /// GrabHandleGlyph's constructor takes additional parameters: 'type' and 'primary selection'. /// Also, we create/cache our pen & brush here to avoid this action with every paint message. /// internal GrabHandleGlyph(Rectangle controlBounds, GrabHandleGlyphType type, Behavior behavior, bool primarySelection) : base(behavior) { isPrimary = primarySelection; hitTestCursor = Cursors.Default; rules = SelectionRules.None; // We +/- DesignerUtils.HANDLEOVERLAP because we want each GrabHandle to overlap the control by DesignerUtils.HANDLEOVERLAP pixels switch (type) { case GrabHandleGlyphType.UpperLeft: bounds = new Rectangle((controlBounds.X+DesignerUtils.HANDLEOVERLAP) - DesignerUtils.HANDLESIZE, (controlBounds.Y+DesignerUtils.HANDLEOVERLAP) - DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE); hitTestCursor = Cursors.SizeNWSE; rules = SelectionRules.TopSizeable | SelectionRules.LeftSizeable; break; case GrabHandleGlyphType.UpperRight: bounds = new Rectangle(controlBounds.Right - DesignerUtils.HANDLEOVERLAP, (controlBounds.Y+DesignerUtils.HANDLEOVERLAP) - DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE); hitTestCursor = Cursors.SizeNESW; rules = SelectionRules.TopSizeable | SelectionRules.RightSizeable; break; case GrabHandleGlyphType.LowerRight: bounds = new Rectangle(controlBounds.Right - DesignerUtils.HANDLEOVERLAP, controlBounds.Bottom-DesignerUtils.HANDLEOVERLAP, DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE); hitTestCursor = Cursors.SizeNWSE; rules = SelectionRules.BottomSizeable | SelectionRules.RightSizeable; break; case GrabHandleGlyphType.LowerLeft: bounds = new Rectangle((controlBounds.X+DesignerUtils.HANDLEOVERLAP) -DesignerUtils.HANDLESIZE, controlBounds.Bottom-DesignerUtils.HANDLEOVERLAP, DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE); hitTestCursor = Cursors.SizeNESW; rules = SelectionRules.BottomSizeable | SelectionRules.LeftSizeable; break; case GrabHandleGlyphType.MiddleTop: // Only add this one if there's room enough. Room is enough is as follows: // 2*HANDLEOVERLAP for UpperLeft and UpperRight handles, 1 HANDLESIZE for the MiddleTop handle, 1 HANDLESIZE // for padding if (controlBounds.Width >= (2 * DesignerUtils.HANDLEOVERLAP) + (2 * DesignerUtils.HANDLESIZE)) { bounds = new Rectangle(controlBounds.X + (controlBounds.Width/2) - (DesignerUtils.HANDLESIZE/2), (controlBounds.Y+DesignerUtils.HANDLEOVERLAP) - DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE); hitTestCursor = Cursors.SizeNS; rules = SelectionRules.TopSizeable; } break; case GrabHandleGlyphType.MiddleBottom: // Only add this one if there's room enough. Room is enough is as follows: // 2*HANDLEOVERLAP for LowerLeft and LowerRight handles, 1 HANDLESIZE for the MiddleBottom handle, 1 HANDLESIZE // for padding if (controlBounds.Width >= (2 * DesignerUtils.HANDLEOVERLAP) + (2 * DesignerUtils.HANDLESIZE)) { bounds = new Rectangle(controlBounds.X + (controlBounds.Width/2) - (DesignerUtils.HANDLESIZE/2), controlBounds.Bottom-DesignerUtils.HANDLEOVERLAP, DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE); hitTestCursor = Cursors.SizeNS; rules = SelectionRules.BottomSizeable; } break; case GrabHandleGlyphType.MiddleLeft: // Only add this one if there's room enough. Room is enough is as follows: // 2*HANDLEOVERLAP for UpperLeft and LowerLeft handles, 1 HANDLESIZE for the MiddleLeft handle, 1 HANDLESIZE // for padding if (controlBounds.Height >= (2 * DesignerUtils.HANDLEOVERLAP) + (2 * DesignerUtils.HANDLESIZE)) { bounds = new Rectangle((controlBounds.X+DesignerUtils.HANDLEOVERLAP) - DesignerUtils.HANDLESIZE, controlBounds.Y + (controlBounds.Height/2) - (DesignerUtils.HANDLESIZE/2), DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE); hitTestCursor = Cursors.SizeWE; rules = SelectionRules.LeftSizeable; } break; case GrabHandleGlyphType.MiddleRight: // Only add this one if there's room enough. Room is enough is as follows: // 2*HANDLEOVERLAP for UpperRight and LowerRight handles, 1 HANDLESIZE for the MiddleRight handle, 1 HANDLESIZE // for padding if (controlBounds.Height >= (2 * DesignerUtils.HANDLEOVERLAP) + (2 * DesignerUtils.HANDLESIZE)) { bounds = new Rectangle(controlBounds.Right - DesignerUtils.HANDLEOVERLAP, controlBounds.Y + (controlBounds.Height/2) - (DesignerUtils.HANDLESIZE/2), DesignerUtils.HANDLESIZE, DesignerUtils.HANDLESIZE); hitTestCursor = Cursors.SizeWE; rules = SelectionRules.RightSizeable; } break; default: Debug.Assert(false, "GrabHandleGlyph was called with a bad GrapHandleGlyphType."); break; } hitBounds = bounds; } ////// /// Very simple paint logic. /// public override void Paint(PaintEventArgs pe) { DesignerUtils.DrawGrabHandle(pe.Graphics, bounds, isPrimary, this); } } } // 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
- BulletDecorator.cs
- WSDualHttpBindingElement.cs
- DataSourceHelper.cs
- TextServicesCompartmentContext.cs
- ScaleTransform.cs
- DataSourceSelectArguments.cs
- SiteMapNodeItem.cs
- InfoCardTraceRecord.cs
- X509ClientCertificateAuthentication.cs
- RegisteredHiddenField.cs
- SrgsGrammarCompiler.cs
- XmlSchemaExporter.cs
- SubMenuStyle.cs
- TextServicesCompartmentEventSink.cs
- GregorianCalendar.cs
- UnmanagedMemoryStreamWrapper.cs
- WebPartDeleteVerb.cs
- CommandPlan.cs
- ComplexPropertyEntry.cs
- CodeDefaultValueExpression.cs
- StateItem.cs
- COM2PictureConverter.cs
- ParseNumbers.cs
- ProxyGenerator.cs
- TreeWalker.cs
- ImagingCache.cs
- SdlChannelSink.cs
- CheckBoxBaseAdapter.cs
- VarRemapper.cs
- SafePEFileHandle.cs
- CalendarTable.cs
- OleDbRowUpdatedEvent.cs
- TrackingProfileCache.cs
- SQLBinaryStorage.cs
- MemberInfoSerializationHolder.cs
- EdmScalarPropertyAttribute.cs
- __TransparentProxy.cs
- ActionFrame.cs
- CodeNamespaceCollection.cs
- RegexWorker.cs
- EnumConverter.cs
- DataView.cs
- MemberDomainMap.cs
- GcHandle.cs
- MouseWheelEventArgs.cs
- BindStream.cs
- DataKey.cs
- DispatcherObject.cs
- FacetValueContainer.cs
- Propagator.Evaluator.cs
- PathStreamGeometryContext.cs
- PropertyPath.cs
- SafeTokenHandle.cs
- AssemblyBuilderData.cs
- DocumentViewerAutomationPeer.cs
- ResourceSet.cs
- GeneralTransformGroup.cs
- DataBindEngine.cs
- Table.cs
- safelinkcollection.cs
- CommonRemoteMemoryBlock.cs
- XPathChildIterator.cs
- Clipboard.cs
- CounterCreationDataCollection.cs
- ViewStateModeByIdAttribute.cs
- DefaultAsyncDataDispatcher.cs
- SingleQueryOperator.cs
- DesignerCapabilities.cs
- IODescriptionAttribute.cs
- TreeNodeClickEventArgs.cs
- AttributeExtensions.cs
- FixedSOMTextRun.cs
- AssemblyName.cs
- activationcontext.cs
- InternalPermissions.cs
- RenderCapability.cs
- FormViewRow.cs
- LookupNode.cs
- RequestCacheEntry.cs
- _FtpDataStream.cs
- ExtensibleClassFactory.cs
- Clipboard.cs
- TemplateParser.cs
- HttpCachePolicyElement.cs
- Math.cs
- SetUserPreferenceRequest.cs
- BitArray.cs
- EmptyEnumerable.cs
- PolicyStatement.cs
- JoinTreeSlot.cs
- ValidatorCollection.cs
- ComEventsSink.cs
- DummyDataSource.cs
- TextChange.cs
- Model3DCollection.cs
- ISAPIRuntime.cs
- PageParser.cs
- HttpGetProtocolReflector.cs
- TextBox.cs
- DescendantBaseQuery.cs