Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / 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;
///
///
/// Encapsulates a GDI Region object.
///
///
#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
///
///
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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EntityWithChangeTrackerStrategy.cs
- IApplicationTrustManager.cs
- TraceUtility.cs
- TaiwanCalendar.cs
- VideoDrawing.cs
- SigningCredentials.cs
- GlyphInfoList.cs
- SafeNativeMethodsOther.cs
- NavigationProperty.cs
- LineGeometry.cs
- ChannelSinkStacks.cs
- DataGridViewTextBoxColumn.cs
- SafeBitVector32.cs
- FloaterBaseParagraph.cs
- TextBoxDesigner.cs
- DependencyPropertyDescriptor.cs
- BadImageFormatException.cs
- TimerElapsedEvenArgs.cs
- WindowsRebar.cs
- XmlNodeReader.cs
- IRCollection.cs
- BulletDecorator.cs
- RunClient.cs
- OutKeywords.cs
- WSDualHttpSecurityMode.cs
- EncryptedType.cs
- ApplicationFileCodeDomTreeGenerator.cs
- HtmlAnchor.cs
- ConnectionManagementElement.cs
- Parser.cs
- CultureInfoConverter.cs
- exports.cs
- XmlHierarchicalDataSourceView.cs
- HtmlControlPersistable.cs
- TreeViewBindingsEditor.cs
- DataGridViewCheckBoxCell.cs
- elementinformation.cs
- GridViewHeaderRowPresenterAutomationPeer.cs
- StringPropertyBuilder.cs
- HttpWriter.cs
- AnnotationService.cs
- objectquery_tresulttype.cs
- Viewport3DAutomationPeer.cs
- _OSSOCK.cs
- KoreanLunisolarCalendar.cs
- TransformDescriptor.cs
- SymbolMethod.cs
- LambdaValue.cs
- PenContext.cs
- InkPresenterAutomationPeer.cs
- SuppressIldasmAttribute.cs
- Matrix3D.cs
- RestClientProxyHandler.cs
- _Connection.cs
- AccessDataSourceWizardForm.cs
- ScaleTransform.cs
- ThreadExceptionEvent.cs
- ClrPerspective.cs
- TrustLevelCollection.cs
- DeclarativeCatalogPart.cs
- Span.cs
- ToolZoneDesigner.cs
- ArgumentException.cs
- AssemblyNameUtility.cs
- FrameDimension.cs
- InvalidChannelBindingException.cs
- DynamicActionMessageFilter.cs
- ContextProperty.cs
- TextReader.cs
- GridLength.cs
- PropertyInfoSet.cs
- ArgumentNullException.cs
- DateTimeStorage.cs
- IsolatedStorageSecurityState.cs
- CompilerGeneratedAttribute.cs
- EventSinkHelperWriter.cs
- DetailsViewDeletedEventArgs.cs
- ZipIOZip64EndOfCentralDirectoryBlock.cs
- FixedFindEngine.cs
- CacheRequest.cs
- MetadataArtifactLoaderCompositeFile.cs
- XdrBuilder.cs
- ThreadAttributes.cs
- ItemContainerProviderWrapper.cs
- DataGridViewCellFormattingEventArgs.cs
- DefaultHttpHandler.cs
- ForEachAction.cs
- QueryableDataSource.cs
- CapiSymmetricAlgorithm.cs
- CaseStatement.cs
- EncoderFallback.cs
- URLIdentityPermission.cs
- FragmentNavigationEventArgs.cs
- Transform3D.cs
- Component.cs
- DefaultMemberAttribute.cs
- _AutoWebProxyScriptEngine.cs
- QilBinary.cs
- RootNamespaceAttribute.cs
- BlockCollection.cs