COM2FontConverter.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / WinForms / Managed / System / WinForms / ComponentModel / COM2Interop / COM2FontConverter.cs / 1 / COM2FontConverter.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

 
namespace System.Windows.Forms.ComponentModel.Com2Interop { 
    using System.Runtime.Serialization.Formatters;
    using System.Runtime.InteropServices; 
    using System.ComponentModel;
    using System.Diagnostics;
    using System;
    using System.Drawing; 
    using System.Collections;
    using Microsoft.Win32; 
 
    /// 
    ///  
    /// This class maps an OLE_COLOR to a managed Color editor.
    /// 
    internal class Com2FontConverter : Com2DataTypeToManagedDataTypeConverter {
 
        private IntPtr lastHandle = IntPtr.Zero;
        private Font lastFont  = null; 
 
        public override bool AllowExpand {
             get { 
                 return true;
             }
         }
 
        /// 
        ///  
        ///     Returns the managed type that this editor maps the property type to. 
        /// 
        public override Type ManagedType { 
            get {
                return typeof(Font);
            }
        } 

 
        ///  
        /// 
        ///     Converts the native value into a managed value 
        /// 
        public override object ConvertNativeToManaged(object nativeValue, Com2PropertyDescriptor pd) {
            // we're getting an IFont thing here
            UnsafeNativeMethods.IFont nativeFont = nativeValue as UnsafeNativeMethods.IFont; 

            if (nativeFont == null) { 
                lastHandle = IntPtr.Zero; 
                lastFont = Control.DefaultFont;
                return lastFont; 
            }

            IntPtr fontHandle = nativeFont.GetHFont();
 
            // see if we have this guy cached
            if (fontHandle == lastHandle && lastFont != null) { 
                return lastFont; 
            }
 
            lastHandle = fontHandle;

            try {
                // this wasn't working because it was converting everything to 
                // world units.
                // 
                Font font = Font.FromHfont(lastHandle); 
                try {
                    lastFont = ControlPaint.FontInPoints(font); 
                }
                finally {
                    font.Dispose();
                } 
            }
            catch(ArgumentException) { 
                // we will fail on non-truetype fonts, so 
                // just use the default font.
                lastFont = Control.DefaultFont; 
            }

            return lastFont;
        } 

        ///  
        ///  
        ///     Converts the managed value into a native value
        ///  
        public override object ConvertManagedToNative(object managedValue, Com2PropertyDescriptor pd, ref bool cancelSet) {

            // we default to black.
            // 
            if (managedValue == null) {
                managedValue = Control.DefaultFont; 
            } 

            cancelSet = true; 

            if (lastFont != null && lastFont.Equals(managedValue)) {
                // don't do anything here.
                return null; 
            }
 
 
            lastFont = (Font)managedValue;
            UnsafeNativeMethods.IFont nativeFont = (UnsafeNativeMethods.IFont)pd.GetNativeValue(pd.TargetObject); 

            // now, push all the values into the native side
            if (nativeFont != null) {
                bool changed = ControlPaint.FontToIFont(lastFont, nativeFont); 

                if (changed) { 
                    // here, we want to pick up a new font from the handle 
                    lastFont = null;
                    ConvertNativeToManaged(nativeFont, pd); 

                }
            }
            return null; 
        }
 
    } 
}
 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK