Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Misc / GDI / WindowsRegion.cs / 1 / WindowsRegion.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- #if WINFORMS_NAMESPACE namespace System.Windows.Forms.Internal #elif DRAWING_NAMESPACE namespace System.Drawing.Internal #else namespace System.Experimental.Gdi #endif { using System; using System.Internal; using System.Runtime.InteropServices; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Globalization; ////// #if WINFORMS_PUBLIC_GRAPHICS_LIBRARY public #else internal #endif sealed partial class WindowsRegion : MarshalByRefObject, ICloneable, IDisposable { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")] private IntPtr nativeHandle; // The hRegion, this class always takes ownership of the hRegion. private bool ownHandle; #if GDI_FINALIZATION_WATCH private string AllocationSite = DbgUtil.StackTrace; #endif ////// Encapsulates a GDI Region object. /// ////// private WindowsRegion() { } ////// public WindowsRegion(Rectangle rect) { CreateRegion(rect); } ////// public WindowsRegion(int x, int y, int width, int height) { CreateRegion(new Rectangle(x,y,width, height)); } // Consider implementing a constructor that calls ExtCreateRegion(XFORM lpXform, DWORD nCount, RGNDATA lpRgnData) if needed. ////// Creates a WindowsRegion from a region handle, if 'takeOwnership' is true, the handle is added to the HandleCollector /// and is removed & destroyed on dispose. /// public static WindowsRegion FromHregion(IntPtr hRegion, bool takeOwnership) { WindowsRegion wr = new WindowsRegion(); // Note: Passing IntPtr.Zero for hRegion is ok. GDI+ infinite regions will have hRegion == null. // GDI's SelectClipRgn interprets null region handle as resetting the clip region (all region will be available for painting). if( hRegion != IntPtr.Zero ) { wr.nativeHandle = hRegion; if (takeOwnership) { wr.ownHandle = true; System.Internal.HandleCollector.Add(hRegion, IntSafeNativeMethods.CommonHandles.GDI); } } return wr; } ////// Creates a WindowsRegion from a System.Drawing.Region. /// public static WindowsRegion FromRegion( Region region, Graphics g ){ if (region.IsInfinite(g)){ // An infinite region would cover the entire device region which is the same as // not having a clipping region. Observe that this is not the same as having an // empty region, which when clipping to it has the effect of excluding the entire // device region. // To remove the clip region from a dc the SelectClipRgn() function needs to be // called with a null region ptr - that's why we use the empty constructor here. // GDI+ will return IntPtr.Zero for Region.GetHrgn(Graphics) when the region is // Infinite. return new WindowsRegion(); } return WindowsRegion.FromHregion(region.GetHrgn(g), true); } ////// public object Clone() { // WARNING: WindowsRegion currently supports rectangulare regions only, if the WindowsRegion was created // from an HRegion and it is not rectangular this method won't work as expected. // Note: This method is currently not used and is here just to implement ICloneable. return this.IsInfinite ? new WindowsRegion() : new WindowsRegion(this.ToRectangle()); } ////// Combines region1 & region2 into this region. The regions cannot be null. /// The three regions need not be distinct. For example, the sourceRgn1 can equal this region. /// public IntNativeMethods.RegionFlags CombineRegion(WindowsRegion region1, WindowsRegion region2, RegionCombineMode mode) { return IntUnsafeNativeMethods.CombineRgn(new HandleRef(this, this.HRegion), new HandleRef(region1, region1.HRegion), new HandleRef(region2, region2.HRegion), mode); } ////// private void CreateRegion(Rectangle rect) { Debug.Assert(nativeHandle == IntPtr.Zero, "nativeHandle should be null, we're leaking handle"); this.nativeHandle = IntSafeNativeMethods.CreateRectRgn(rect.X, rect.Y, rect.X+rect.Width, rect.Y+rect.Height); ownHandle = true; } ////// public void Dispose() { Dispose(true); } ////// public void Dispose(bool disposing) { if (this.nativeHandle != IntPtr.Zero) { DbgUtil.AssertFinalization(this, disposing); if( this.ownHandle ) { IntUnsafeNativeMethods.DeleteObject(new HandleRef(this, this.nativeHandle)); } this.nativeHandle = IntPtr.Zero; if (disposing) { GC.SuppressFinalize(this); } } } ////// ~WindowsRegion() { Dispose(false); } ////// The native region handle. /// public IntPtr HRegion { get { return this.nativeHandle; } } ////// public bool IsInfinite { get { return this.nativeHandle == IntPtr.Zero; } } ////// A rectangle representing the window region set with the SetWindowRgn function. /// public Rectangle ToRectangle() { if( this.IsInfinite ) { return new Rectangle( -Int32.MaxValue, -Int32.MaxValue, Int32.MaxValue, Int32.MaxValue ); } IntNativeMethods.RECT rect = new IntNativeMethods.RECT(); IntUnsafeNativeMethods.GetRgnBox(new HandleRef(this, this.nativeHandle), ref rect); return new Rectangle(new Point(rect.left, rect.top), rect.Size); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- #if WINFORMS_NAMESPACE namespace System.Windows.Forms.Internal #elif DRAWING_NAMESPACE namespace System.Drawing.Internal #else namespace System.Experimental.Gdi #endif { using System; using System.Internal; using System.Runtime.InteropServices; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Globalization; ////// #if WINFORMS_PUBLIC_GRAPHICS_LIBRARY public #else internal #endif sealed partial class WindowsRegion : MarshalByRefObject, ICloneable, IDisposable { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")] private IntPtr nativeHandle; // The hRegion, this class always takes ownership of the hRegion. private bool ownHandle; #if GDI_FINALIZATION_WATCH private string AllocationSite = DbgUtil.StackTrace; #endif ////// Encapsulates a GDI Region object. /// ////// private WindowsRegion() { } ////// public WindowsRegion(Rectangle rect) { CreateRegion(rect); } ////// public WindowsRegion(int x, int y, int width, int height) { CreateRegion(new Rectangle(x,y,width, height)); } // Consider implementing a constructor that calls ExtCreateRegion(XFORM lpXform, DWORD nCount, RGNDATA lpRgnData) if needed. ////// Creates a WindowsRegion from a region handle, if 'takeOwnership' is true, the handle is added to the HandleCollector /// and is removed & destroyed on dispose. /// public static WindowsRegion FromHregion(IntPtr hRegion, bool takeOwnership) { WindowsRegion wr = new WindowsRegion(); // Note: Passing IntPtr.Zero for hRegion is ok. GDI+ infinite regions will have hRegion == null. // GDI's SelectClipRgn interprets null region handle as resetting the clip region (all region will be available for painting). if( hRegion != IntPtr.Zero ) { wr.nativeHandle = hRegion; if (takeOwnership) { wr.ownHandle = true; System.Internal.HandleCollector.Add(hRegion, IntSafeNativeMethods.CommonHandles.GDI); } } return wr; } ////// Creates a WindowsRegion from a System.Drawing.Region. /// public static WindowsRegion FromRegion( Region region, Graphics g ){ if (region.IsInfinite(g)){ // An infinite region would cover the entire device region which is the same as // not having a clipping region. Observe that this is not the same as having an // empty region, which when clipping to it has the effect of excluding the entire // device region. // To remove the clip region from a dc the SelectClipRgn() function needs to be // called with a null region ptr - that's why we use the empty constructor here. // GDI+ will return IntPtr.Zero for Region.GetHrgn(Graphics) when the region is // Infinite. return new WindowsRegion(); } return WindowsRegion.FromHregion(region.GetHrgn(g), true); } ////// public object Clone() { // WARNING: WindowsRegion currently supports rectangulare regions only, if the WindowsRegion was created // from an HRegion and it is not rectangular this method won't work as expected. // Note: This method is currently not used and is here just to implement ICloneable. return this.IsInfinite ? new WindowsRegion() : new WindowsRegion(this.ToRectangle()); } ////// Combines region1 & region2 into this region. The regions cannot be null. /// The three regions need not be distinct. For example, the sourceRgn1 can equal this region. /// public IntNativeMethods.RegionFlags CombineRegion(WindowsRegion region1, WindowsRegion region2, RegionCombineMode mode) { return IntUnsafeNativeMethods.CombineRgn(new HandleRef(this, this.HRegion), new HandleRef(region1, region1.HRegion), new HandleRef(region2, region2.HRegion), mode); } ////// private void CreateRegion(Rectangle rect) { Debug.Assert(nativeHandle == IntPtr.Zero, "nativeHandle should be null, we're leaking handle"); this.nativeHandle = IntSafeNativeMethods.CreateRectRgn(rect.X, rect.Y, rect.X+rect.Width, rect.Y+rect.Height); ownHandle = true; } ////// public void Dispose() { Dispose(true); } ////// public void Dispose(bool disposing) { if (this.nativeHandle != IntPtr.Zero) { DbgUtil.AssertFinalization(this, disposing); if( this.ownHandle ) { IntUnsafeNativeMethods.DeleteObject(new HandleRef(this, this.nativeHandle)); } this.nativeHandle = IntPtr.Zero; if (disposing) { GC.SuppressFinalize(this); } } } ////// ~WindowsRegion() { Dispose(false); } ////// The native region handle. /// public IntPtr HRegion { get { return this.nativeHandle; } } ////// public bool IsInfinite { get { return this.nativeHandle == IntPtr.Zero; } } ////// A rectangle representing the window region set with the SetWindowRgn function. /// public Rectangle ToRectangle() { if( this.IsInfinite ) { return new Rectangle( -Int32.MaxValue, -Int32.MaxValue, Int32.MaxValue, Int32.MaxValue ); } IntNativeMethods.RECT rect = new IntNativeMethods.RECT(); IntUnsafeNativeMethods.GetRgnBox(new HandleRef(this, this.nativeHandle), ref rect); return new Rectangle(new Point(rect.left, rect.top), rect.Size); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RelationalExpressions.cs
- PhysicalFontFamily.cs
- MethodCallTranslator.cs
- TabletDeviceInfo.cs
- CachedCompositeFamily.cs
- TraceUtility.cs
- Attributes.cs
- IResourceProvider.cs
- Compiler.cs
- PackageDigitalSignature.cs
- ScriptModule.cs
- BamlTreeMap.cs
- NameValueCollection.cs
- MediaTimeline.cs
- StateMachineSubscription.cs
- ModelPerspective.cs
- UriScheme.cs
- XmlILOptimizerVisitor.cs
- ValidationError.cs
- NonVisualControlAttribute.cs
- SmtpMail.cs
- IISUnsafeMethods.cs
- AssociationSetMetadata.cs
- QilSortKey.cs
- DefaultBinder.cs
- DropShadowEffect.cs
- AsymmetricKeyExchangeFormatter.cs
- SizeAnimationBase.cs
- DiagnosticsConfiguration.cs
- KnownTypes.cs
- QuaternionConverter.cs
- AppDomainManager.cs
- OutputCacheSettingsSection.cs
- RequiredAttributeAttribute.cs
- InputBinding.cs
- SerialPort.cs
- CuspData.cs
- TagNameToTypeMapper.cs
- HtmlDocument.cs
- Stylesheet.cs
- log.cs
- HttpListenerResponse.cs
- NameSpaceExtractor.cs
- NoClickablePointException.cs
- ConnectionsZoneDesigner.cs
- GetUserPreferenceRequest.cs
- Permission.cs
- ReadOnlyActivityGlyph.cs
- _DisconnectOverlappedAsyncResult.cs
- WebFormDesignerActionService.cs
- XmlSchemaAny.cs
- ActivityCollectionMarkupSerializer.cs
- XpsImage.cs
- RemoteX509Token.cs
- tooltip.cs
- BlockExpression.cs
- CodeAttributeDeclaration.cs
- RegexCapture.cs
- AggregateException.cs
- HtmlInputText.cs
- UrlAuthorizationModule.cs
- TraceUtility.cs
- TextEditorThreadLocalStore.cs
- UpdateTracker.cs
- EpmContentDeSerializerBase.cs
- SrgsElement.cs
- WebPartConnectionsEventArgs.cs
- LocationUpdates.cs
- ClientTargetCollection.cs
- Style.cs
- AlternateViewCollection.cs
- SqlCrossApplyToCrossJoin.cs
- NamedPipeHostedTransportConfiguration.cs
- EngineSiteSapi.cs
- Group.cs
- FixedFlowMap.cs
- DynamicRouteExpression.cs
- SevenBitStream.cs
- WpfXamlLoader.cs
- DesignTimeType.cs
- DoubleCollectionConverter.cs
- PackageDigitalSignatureManager.cs
- LogicalExpressionTypeConverter.cs
- FamilyCollection.cs
- SHA256Managed.cs
- ToolStripSplitStackLayout.cs
- WCFServiceClientProxyGenerator.cs
- AuthenticatingEventArgs.cs
- WindowsListViewGroupSubsetLink.cs
- ByValueEqualityComparer.cs
- DataControlLinkButton.cs
- WorkflowMarkupSerializationException.cs
- StatusBarItemAutomationPeer.cs
- SoapEnumAttribute.cs
- ObjectAnimationBase.cs
- HtmlShimManager.cs
- Help.cs
- SynchronizationHandlesCodeDomSerializer.cs
- WebPartConnectionsDisconnectVerb.cs
- HttpWrapper.cs