Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / WinForms / Managed / System / WinForms / GDI / WindowsGraphicsWrapper.cs / 1 / WindowsGraphicsWrapper.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Windows.Forms
{
using System.Internal;
using System;
using System.Drawing;
using System.Windows.Forms.Internal;
using System.Diagnostics;
///
/// This class wrapps a WindowsGraphics and is provided to be able to manipulate WindowsGraphics objects
/// created from a Graphics object in the same way as one created from any other IDeviceContext object,
/// which could be a custom one.
/// This class was designed to help TextRenderer determine how to create the underlying WindowsGraphics.
///
internal sealed class WindowsGraphicsWrapper : IDisposable
{
IDeviceContext idc;
WindowsGraphics wg;
///
/// Constructor that determines how to create the WindowsGraphics, there are three posible cases
/// for the IDeviceContext object type:
/// 1. It is a Graphics object: In this case we need to check the TextFormatFlags to determine whether
/// we need to re-apply some of the Graphics properties to the WindowsGraphics, if so we call
/// WindowsGraphics.FromGraphics passing the corresponding flags. If not, we treat it as a custom
/// IDeviceContext (see below).
/// 2. It is a WindowsGraphics object:
/// In this case we just need to use the wg directly and be careful not to dispose of it since
/// it is owned by the caller.
/// 3. It is a custom IDeviceContext object:
/// In this case we create the WindowsGraphics from the native DC by calling IDeviceContext.GetHdc,
/// on dispose we need to call IDeviceContext.ReleaseHdc.
///
public WindowsGraphicsWrapper( IDeviceContext idc, TextFormatFlags flags)
{
if( idc is Graphics )
{
ApplyGraphicsProperties properties = ApplyGraphicsProperties.None;
if( (flags & TextFormatFlags.PreserveGraphicsClipping) != 0)
{
properties |= ApplyGraphicsProperties.Clipping;
}
if( (flags & TextFormatFlags.PreserveGraphicsTranslateTransform) != 0)
{
properties |= ApplyGraphicsProperties.TranslateTransform;
}
// Create the WindowsGraphics from the Grahpics object only if Graphics properties need
// to be reapplied to the DC wrapped by the WindowsGraphics.
if( properties != ApplyGraphicsProperties.None )
{
this.wg = WindowsGraphics.FromGraphics( idc as Graphics, properties);
}
}
else
{
// If passed-in IDeviceContext object is a WindowsGraphics we can use it directly.
this.wg = idc as WindowsGraphics;
if( this.wg != null )
{
// In this case we cache the idc to compare it against the wg in the Dispose method to avoid
// disposing of the wg.
this.idc = idc;
}
}
if( this.wg == null )
{
// The IDeviceContext object is not a WindowsGraphics, or it is a custom IDeviceContext, or
// it is a Graphics object but we did not need to re-apply Graphics propertiesto the hdc.
// So create the WindowsGraphics from the hdc directly.
// Cache the IDC so the hdc can be released on dispose.
this.idc = idc;
this.wg = WindowsGraphics.FromHdc( idc.GetHdc() );
}
// Set text padding on the WindowsGraphics (if any).
if( (flags & TextFormatFlags.LeftAndRightPadding) != 0 )
{
wg.TextPadding = TextPaddingOptions.LeftAndRightPadding;
}
else if ((flags & TextFormatFlags.NoPadding) != 0 )
{
wg.TextPadding = TextPaddingOptions.NoPadding;
}
// else wg.TextPadding = TextPaddingOptions.GlyphOverhangPadding - the default value.
}
public WindowsGraphics WindowsGraphics
{
get
{
Debug.Assert( this.wg != null, "WindowsGraphics is null." );
return this.wg;
}
}
~WindowsGraphicsWrapper()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose( bool disposing )
{
Debug.Assert( disposing, "We should always dispose of this guy and not let GC do it for us!" );
if( this.wg != null )
{
// We need to dispose of the WindowsGraphics if it is created by this class only, if the IDeviceContext is
// a WindowsGraphics object we must not dispose of it since it is owned by the caller.
if( this.wg != this.idc )
{
// resets the hdc and disposes of the internal Graphics (if inititialized from one) which releases the hdc.
this.wg.Dispose();
if( this.idc != null ) // not initialized from a Graphics idc.
{
this.idc.ReleaseHdc();
}
}
this.idc = null;
this.wg = null;
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Windows.Forms
{
using System.Internal;
using System;
using System.Drawing;
using System.Windows.Forms.Internal;
using System.Diagnostics;
///
/// This class wrapps a WindowsGraphics and is provided to be able to manipulate WindowsGraphics objects
/// created from a Graphics object in the same way as one created from any other IDeviceContext object,
/// which could be a custom one.
/// This class was designed to help TextRenderer determine how to create the underlying WindowsGraphics.
///
internal sealed class WindowsGraphicsWrapper : IDisposable
{
IDeviceContext idc;
WindowsGraphics wg;
///
/// Constructor that determines how to create the WindowsGraphics, there are three posible cases
/// for the IDeviceContext object type:
/// 1. It is a Graphics object: In this case we need to check the TextFormatFlags to determine whether
/// we need to re-apply some of the Graphics properties to the WindowsGraphics, if so we call
/// WindowsGraphics.FromGraphics passing the corresponding flags. If not, we treat it as a custom
/// IDeviceContext (see below).
/// 2. It is a WindowsGraphics object:
/// In this case we just need to use the wg directly and be careful not to dispose of it since
/// it is owned by the caller.
/// 3. It is a custom IDeviceContext object:
/// In this case we create the WindowsGraphics from the native DC by calling IDeviceContext.GetHdc,
/// on dispose we need to call IDeviceContext.ReleaseHdc.
///
public WindowsGraphicsWrapper( IDeviceContext idc, TextFormatFlags flags)
{
if( idc is Graphics )
{
ApplyGraphicsProperties properties = ApplyGraphicsProperties.None;
if( (flags & TextFormatFlags.PreserveGraphicsClipping) != 0)
{
properties |= ApplyGraphicsProperties.Clipping;
}
if( (flags & TextFormatFlags.PreserveGraphicsTranslateTransform) != 0)
{
properties |= ApplyGraphicsProperties.TranslateTransform;
}
// Create the WindowsGraphics from the Grahpics object only if Graphics properties need
// to be reapplied to the DC wrapped by the WindowsGraphics.
if( properties != ApplyGraphicsProperties.None )
{
this.wg = WindowsGraphics.FromGraphics( idc as Graphics, properties);
}
}
else
{
// If passed-in IDeviceContext object is a WindowsGraphics we can use it directly.
this.wg = idc as WindowsGraphics;
if( this.wg != null )
{
// In this case we cache the idc to compare it against the wg in the Dispose method to avoid
// disposing of the wg.
this.idc = idc;
}
}
if( this.wg == null )
{
// The IDeviceContext object is not a WindowsGraphics, or it is a custom IDeviceContext, or
// it is a Graphics object but we did not need to re-apply Graphics propertiesto the hdc.
// So create the WindowsGraphics from the hdc directly.
// Cache the IDC so the hdc can be released on dispose.
this.idc = idc;
this.wg = WindowsGraphics.FromHdc( idc.GetHdc() );
}
// Set text padding on the WindowsGraphics (if any).
if( (flags & TextFormatFlags.LeftAndRightPadding) != 0 )
{
wg.TextPadding = TextPaddingOptions.LeftAndRightPadding;
}
else if ((flags & TextFormatFlags.NoPadding) != 0 )
{
wg.TextPadding = TextPaddingOptions.NoPadding;
}
// else wg.TextPadding = TextPaddingOptions.GlyphOverhangPadding - the default value.
}
public WindowsGraphics WindowsGraphics
{
get
{
Debug.Assert( this.wg != null, "WindowsGraphics is null." );
return this.wg;
}
}
~WindowsGraphicsWrapper()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose( bool disposing )
{
Debug.Assert( disposing, "We should always dispose of this guy and not let GC do it for us!" );
if( this.wg != null )
{
// We need to dispose of the WindowsGraphics if it is created by this class only, if the IDeviceContext is
// a WindowsGraphics object we must not dispose of it since it is owned by the caller.
if( this.wg != this.idc )
{
// resets the hdc and disposes of the internal Graphics (if inititialized from one) which releases the hdc.
this.wg.Dispose();
if( this.idc != null ) // not initialized from a Graphics idc.
{
this.idc.ReleaseHdc();
}
}
this.idc = null;
this.wg = null;
}
}
}
}
// 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
- ArrayList.cs
- HttpRawResponse.cs
- StorageBasedPackageProperties.cs
- SAPIEngineTypes.cs
- util.cs
- StateMachine.cs
- ParameterCollectionEditor.cs
- LazyTextWriterCreator.cs
- StandardCommands.cs
- MenuItem.cs
- EventHandlerList.cs
- LinkLabelLinkClickedEvent.cs
- ProxyWebPartConnectionCollection.cs
- BitmapEffect.cs
- ProtocolsInstallComponent.cs
- SqlDataSourceCache.cs
- ConfigXmlComment.cs
- Baml2006ReaderFrame.cs
- XmlUrlResolver.cs
- ContentControl.cs
- X509RawDataKeyIdentifierClause.cs
- IdnMapping.cs
- DbTransaction.cs
- FacetValues.cs
- PerspectiveCamera.cs
- DateTimeHelper.cs
- MatrixValueSerializer.cs
- ArrayHelper.cs
- PerformanceCounterTraceRecord.cs
- GorillaCodec.cs
- SqlDependencyUtils.cs
- XdrBuilder.cs
- TextPointer.cs
- TextBox.cs
- OleStrCAMarshaler.cs
- DataBindingHandlerAttribute.cs
- EndOfStreamException.cs
- TripleDESCryptoServiceProvider.cs
- Parameter.cs
- shaper.cs
- ContainerUtilities.cs
- DeviceFilterEditorDialog.cs
- ButtonBaseAutomationPeer.cs
- RemoteWebConfigurationHostStream.cs
- PermissionToken.cs
- LinqDataSourceValidationException.cs
- TypeGeneratedEventArgs.cs
- SpeechRecognitionEngine.cs
- IsolatedStorageFile.cs
- ControlBuilderAttribute.cs
- ScalarType.cs
- ActiveXHost.cs
- Persist.cs
- FunctionUpdateCommand.cs
- SourceFileBuildProvider.cs
- SynchronizationLockException.cs
- SchemaTypeEmitter.cs
- DataViewSetting.cs
- _ContextAwareResult.cs
- TypeUtils.cs
- EtwTrace.cs
- DataRowCollection.cs
- XmlNamespaceMappingCollection.cs
- MenuCommands.cs
- WebDisplayNameAttribute.cs
- ManifestSignedXml.cs
- OptimizerPatterns.cs
- UInt64.cs
- LinkDesigner.cs
- StyleConverter.cs
- SqlNotificationEventArgs.cs
- DataSet.cs
- TerminatorSinks.cs
- UnaryOperationBinder.cs
- BitmapFrameEncode.cs
- Char.cs
- SerializationInfoEnumerator.cs
- SymbolMethod.cs
- ResourceAttributes.cs
- DataTableReader.cs
- SoapIgnoreAttribute.cs
- NumberSubstitution.cs
- EmbeddedMailObject.cs
- DbConnectionStringCommon.cs
- IPAddress.cs
- WebExceptionStatus.cs
- Compensate.cs
- PrintDialogException.cs
- SqlServices.cs
- EpmSourcePathSegment.cs
- ResourcesBuildProvider.cs
- StrokeNodeOperations2.cs
- XmlSchemaValidator.cs
- DataGridColumnFloatingHeader.cs
- ComNativeDescriptor.cs
- CannotUnloadAppDomainException.cs
- DataGridViewRowsRemovedEventArgs.cs
- RelationshipWrapper.cs
- ProxyWebPart.cs
- TextTreePropertyUndoUnit.cs