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
- SoapAttributeAttribute.cs
- listitem.cs
- CfgParser.cs
- XPathMultyIterator.cs
- KeyboardNavigation.cs
- DuplicateWaitObjectException.cs
- DodSequenceMerge.cs
- CheckBoxStandardAdapter.cs
- WindowsTooltip.cs
- XmlChoiceIdentifierAttribute.cs
- safePerfProviderHandle.cs
- VariableAction.cs
- ElementUtil.cs
- EventPrivateKey.cs
- DefaultWorkflowTransactionService.cs
- InternalSafeNativeMethods.cs
- QueryOptionExpression.cs
- EventMap.cs
- DesignerVerbToolStripMenuItem.cs
- TerminateSequenceResponse.cs
- WebPartVerbsEventArgs.cs
- OdbcConnectionHandle.cs
- DbException.cs
- ListViewInsertionMark.cs
- ProviderBase.cs
- FieldMetadata.cs
- ExtensionDataObject.cs
- ExceptionHandlers.cs
- SecurityPolicySection.cs
- Item.cs
- DataControlPagerLinkButton.cs
- PointKeyFrameCollection.cs
- HtmlInputHidden.cs
- TemplatePagerField.cs
- ConfigWriter.cs
- HorizontalAlignConverter.cs
- Cell.cs
- EntityModelBuildProvider.cs
- PropertyFilterAttribute.cs
- MSAAWinEventWrap.cs
- ResourceReferenceKeyNotFoundException.cs
- HelpInfo.cs
- ReversePositionQuery.cs
- CombinedTcpChannel.cs
- Header.cs
- String.cs
- HttpStreams.cs
- ConfigXmlAttribute.cs
- TraceContext.cs
- EnumValAlphaComparer.cs
- SafeRegistryKey.cs
- Merger.cs
- ConfigurationManagerHelper.cs
- COM2FontConverter.cs
- IndexedGlyphRun.cs
- TableCellCollection.cs
- SymmetricKey.cs
- TypeViewSchema.cs
- LassoHelper.cs
- SqlRetyper.cs
- CreateSequenceResponse.cs
- GradientStopCollection.cs
- ClosableStream.cs
- XmlArrayAttribute.cs
- SqlDataSourceTableQuery.cs
- XmlCharacterData.cs
- TripleDES.cs
- CapiHashAlgorithm.cs
- ProfileManager.cs
- DataGridViewCellCollection.cs
- GridViewUpdatedEventArgs.cs
- HttpUnhandledOperationInvoker.cs
- BidPrivateBase.cs
- StatusBar.cs
- DataGridItemEventArgs.cs
- PathNode.cs
- LicenseContext.cs
- ValueUtilsSmi.cs
- NoPersistScope.cs
- HttpTransportBindingElement.cs
- ArrayList.cs
- InfiniteIntConverter.cs
- RuntimeConfigurationRecord.cs
- WSSecurityPolicy11.cs
- DataGridSortCommandEventArgs.cs
- ExceptionUtility.cs
- HasCopySemanticsAttribute.cs
- QueryPageSettingsEventArgs.cs
- GifBitmapEncoder.cs
- BoundingRectTracker.cs
- SmiEventStream.cs
- ReturnType.cs
- HealthMonitoringSectionHelper.cs
- ClipboardProcessor.cs
- DataErrorValidationRule.cs
- SmiRecordBuffer.cs
- EdmFunction.cs
- FacetValueContainer.cs
- DependencyPropertyDescriptor.cs
- WasEndpointConfigContainer.cs