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
- DesignBindingPicker.cs
- SqlError.cs
- InternalTypeHelper.cs
- BindingContext.cs
- PackageRelationshipCollection.cs
- PeerNameResolver.cs
- FilterableAttribute.cs
- DSASignatureFormatter.cs
- MouseButton.cs
- MatrixTransform.cs
- Int64AnimationUsingKeyFrames.cs
- WebContext.cs
- HostingEnvironment.cs
- ObfuscateAssemblyAttribute.cs
- ServiceKnownTypeAttribute.cs
- SecurityUtils.cs
- DefaultTextStore.cs
- BrowsableAttribute.cs
- KeyInfo.cs
- HashCryptoHandle.cs
- StrokeNodeEnumerator.cs
- TextFindEngine.cs
- IItemProperties.cs
- IsolationInterop.cs
- SoapCodeExporter.cs
- ImageBrush.cs
- ObfuscateAssemblyAttribute.cs
- LogLogRecord.cs
- AsymmetricSecurityBindingElement.cs
- BatchParser.cs
- TextCollapsingProperties.cs
- NativeObjectSecurity.cs
- DesignerLoader.cs
- _CacheStreams.cs
- hresults.cs
- ProgramNode.cs
- GridPatternIdentifiers.cs
- HyperLinkColumn.cs
- DoubleLinkList.cs
- FunctionDefinition.cs
- ListViewItem.cs
- AuthStoreRoleProvider.cs
- ChineseLunisolarCalendar.cs
- DataQuery.cs
- SizeConverter.cs
- ProxyWebPartConnectionCollection.cs
- TextElement.cs
- BitmapEffectInputData.cs
- WebUtil.cs
- OperationCanceledException.cs
- ResourceExpression.cs
- DateTimeOffsetAdapter.cs
- bindurihelper.cs
- FontFamily.cs
- UnaryExpression.cs
- InputBuffer.cs
- TextEditorThreadLocalStore.cs
- RsaSecurityToken.cs
- UniqueEventHelper.cs
- SimpleApplicationHost.cs
- Debug.cs
- Focus.cs
- WindowManager.cs
- Material.cs
- OleDbMetaDataFactory.cs
- SqlRowUpdatedEvent.cs
- XNameConverter.cs
- BinHexEncoder.cs
- FixedTextPointer.cs
- ValidationEventArgs.cs
- Slider.cs
- DbSourceParameterCollection.cs
- TraceSource.cs
- securitymgrsite.cs
- Section.cs
- GotoExpression.cs
- CaseStatementSlot.cs
- HandleCollector.cs
- TreeNodeEventArgs.cs
- FrameworkContentElement.cs
- ServiceChannelManager.cs
- Int32RectValueSerializer.cs
- TemplateXamlTreeBuilder.cs
- WebServiceMethodData.cs
- WsatServiceCertificate.cs
- NavigationCommands.cs
- IQueryable.cs
- BasicKeyConstraint.cs
- TypeInfo.cs
- StringHelper.cs
- querybuilder.cs
- Style.cs
- SchemaTableOptionalColumn.cs
- XmlSchemaInclude.cs
- ProfileService.cs
- Size3DValueSerializer.cs
- CategoryEditor.cs
- MessageRpc.cs
- FontNamesConverter.cs
- TTSEngineProxy.cs