277 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.Windows.Forms;
 | 
						|
using System.Drawing.Text;
 | 
						|
using System.Collections.Generic;
 | 
						|
 | 
						|
#if DOTNETBAR
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
#elif LAYOUT
 | 
						|
namespace DevComponents.DotNetBar.Layout
 | 
						|
#else
 | 
						|
namespace DevComponents.Tree
 | 
						|
#endif
 | 
						|
{
 | 
						|
    public class TextDrawing
 | 
						|
    {
 | 
						|
        static TextDrawing()
 | 
						|
        {
 | 
						|
            string lc = Application.CurrentCulture.TwoLetterISOLanguageName;
 | 
						|
            if (lc == "ja" || lc == "ko" || lc == "zh" || lc == "ar")
 | 
						|
                UseGenericDefault = true;
 | 
						|
        }
 | 
						|
 | 
						|
        public static bool TextDrawingEnabled = true;
 | 
						|
        public static bool UseTextRenderer = false;
 | 
						|
 | 
						|
        public static void DrawString(Graphics g, string text, Font font, Color color, int x, int y, eTextFormat format)
 | 
						|
        {
 | 
						|
            DrawString(g, text, font, color, new Rectangle(x, y, 0, 0), format);
 | 
						|
        }
 | 
						|
        public static void DrawString(Graphics g, string text, Font font, Color color, Rectangle bounds, eTextFormat format)
 | 
						|
        {
 | 
						|
            #if FRAMEWORK20
 | 
						|
            if (UseTextRenderer && (format & eTextFormat.Vertical) == 0)
 | 
						|
                TextRenderer.DrawText(g, text, font, bounds, color, GetTextFormatFlags(format));
 | 
						|
            else
 | 
						|
                DrawStringLegacy(g, text, font, color, bounds, format);
 | 
						|
            #else
 | 
						|
            DrawStringLegacy(g, text, font, color, bounds, format);
 | 
						|
            #endif
 | 
						|
        }
 | 
						|
 | 
						|
        public static void DrawStringLegacy(Graphics g, string text, Font font, Color color, Rectangle bounds, eTextFormat format)
 | 
						|
        {
 | 
						|
            if (color.IsEmpty || !TextDrawingEnabled)
 | 
						|
                return;
 | 
						|
 | 
						|
            using (SolidBrush brush = new SolidBrush(color))
 | 
						|
            {
 | 
						|
                //using (StringFormat sf = GetStringFormat(format))
 | 
						|
                StringFormat sf = GetStringFormat(format);
 | 
						|
                    g.DrawString(text, font, brush, bounds, sf);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        public static void DrawStringLegacy(Graphics g, string text, Font font, Color color, RectangleF bounds, eTextFormat format)
 | 
						|
        {
 | 
						|
            if (color.IsEmpty || !TextDrawingEnabled)
 | 
						|
                return;
 | 
						|
 | 
						|
            using (SolidBrush brush = new SolidBrush(color))
 | 
						|
            {
 | 
						|
                StringFormat sf = GetStringFormat(format);
 | 
						|
                g.DrawString(text, font, brush, bounds, sf);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        public static Size MeasureString(Graphics g, string text, Font font)
 | 
						|
        {
 | 
						|
            return MeasureString(g, text, font, Size.Empty, eTextFormat.Default);
 | 
						|
        }
 | 
						|
 | 
						|
        public static Size MeasureString(Graphics g, string text, Font font, int proposedWidth, eTextFormat format)
 | 
						|
        {
 | 
						|
            return MeasureString(g, text, font, new Size(proposedWidth, 0), format);
 | 
						|
        }
 | 
						|
 | 
						|
        public static Size MeasureString(Graphics g, string text, Font font, int proposedWidth)
 | 
						|
        {
 | 
						|
            return MeasureString(g, text, font, new Size(proposedWidth, 0), eTextFormat.Default);
 | 
						|
        }
 | 
						|
 | 
						|
        public static Size MeasureString(Graphics g, string text, Font font, Size proposedSize, eTextFormat format)
 | 
						|
        {
 | 
						|
            #if FRAMEWORK20
 | 
						|
            if (UseTextRenderer && (format & eTextFormat.Vertical) == 0)
 | 
						|
            {
 | 
						|
                format = format & ~(format & eTextFormat.VerticalCenter); // Bug in .NET Framework 2.0
 | 
						|
                format = format & ~(format & eTextFormat.Bottom); // Bug in .NET Framework 2.0
 | 
						|
                format = format & ~(format & eTextFormat.HorizontalCenter); // Bug in .NET Framework 2.0
 | 
						|
                format = format & ~(format & eTextFormat.Right); // Bug in .NET Framework 2.0
 | 
						|
                format = format & ~(format & eTextFormat.EndEllipsis); // Bug in .NET Framework 2.0
 | 
						|
                return Size.Ceiling(TextRenderer.MeasureText(g, text, font, proposedSize, GetTextFormatFlags(format)));
 | 
						|
            }
 | 
						|
            //using (StringFormat sf = GetStringFormat(format))
 | 
						|
            StringFormat sf = GetStringFormat(format);
 | 
						|
                return Size.Ceiling(g.MeasureString(text, font, proposedSize, sf));
 | 
						|
            #else
 | 
						|
            //using (StringFormat sf = GetStringFormat(format))
 | 
						|
            StringFormat sf = GetStringFormat(format);
 | 
						|
                return Size.Ceiling(g.MeasureString(text, font, proposedSize, sf));
 | 
						|
#endif
 | 
						|
            }
 | 
						|
 | 
						|
        public static Size MeasureStringLegacy(Graphics g, string text, Font font, Size proposedSize, eTextFormat format)
 | 
						|
        {
 | 
						|
            //using (StringFormat sf = GetStringFormat(format))
 | 
						|
            StringFormat sf = GetStringFormat(format);
 | 
						|
                return g.MeasureString(text, font, proposedSize, sf).ToSize();
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        public static eTextFormat TranslateHorizontal(StringAlignment align)
 | 
						|
        {
 | 
						|
            if (align == StringAlignment.Center)
 | 
						|
                return eTextFormat.HorizontalCenter;
 | 
						|
            else if (align == StringAlignment.Far)
 | 
						|
                return eTextFormat.Right;
 | 
						|
            return eTextFormat.Default;
 | 
						|
        }
 | 
						|
 | 
						|
        public static eTextFormat TranslateVertical(StringAlignment align)
 | 
						|
        {
 | 
						|
            if (align == StringAlignment.Center)
 | 
						|
                return eTextFormat.VerticalCenter;
 | 
						|
            else if (align == StringAlignment.Far)
 | 
						|
                return eTextFormat.Bottom;
 | 
						|
            return eTextFormat.Default;
 | 
						|
        }
 | 
						|
 | 
						|
#if FRAMEWORK20
 | 
						|
        public static TextFormatFlags GetTextFormatFlags(eTextFormat format)
 | 
						|
        {
 | 
						|
            format |= eTextFormat.PreserveGraphicsTranslateTransform | eTextFormat.PreserveGraphicsClipping;
 | 
						|
            if((format & eTextFormat.SingleLine)==eTextFormat.SingleLine && (format & eTextFormat.WordBreak)==eTextFormat.WordBreak)
 | 
						|
                format = format & ~(format & eTextFormat.SingleLine);
 | 
						|
            return (TextFormatFlags)format;
 | 
						|
        }
 | 
						|
#endif
 | 
						|
        internal static bool UseGenericDefault = false;
 | 
						|
 | 
						|
        private static Dictionary<eTextFormat, StringFormat> _CachedFormats = new Dictionary<eTextFormat, StringFormat>();
 | 
						|
        public static StringFormat GetStringFormat(eTextFormat format)
 | 
						|
        {
 | 
						|
            StringFormat sf;
 | 
						|
 | 
						|
            if (_CachedFormats.TryGetValue(format, out sf)) return sf;
 | 
						|
 | 
						|
            if (UseGenericDefault)
 | 
						|
                sf = (StringFormat)StringFormat.GenericDefault.Clone(); //new StringFormat(StringFormat.GenericDefault);
 | 
						|
            else
 | 
						|
                sf = (StringFormat)StringFormat.GenericTypographic.Clone(); // new StringFormat(StringFormat.GenericTypographic);
 | 
						|
 | 
						|
            if (format == eTextFormat.Default)
 | 
						|
            {
 | 
						|
                sf.HotkeyPrefix = HotkeyPrefix.Show;
 | 
						|
                _CachedFormats.Add(format, sf);
 | 
						|
                return sf;
 | 
						|
            }
 | 
						|
            if ((format & eTextFormat.HorizontalCenter) == eTextFormat.HorizontalCenter)
 | 
						|
                sf.Alignment = StringAlignment.Center;
 | 
						|
            else if ((format & eTextFormat.Right) == eTextFormat.Right)
 | 
						|
                sf.Alignment=StringAlignment.Far;
 | 
						|
            if ((format & eTextFormat.VerticalCenter) == eTextFormat.VerticalCenter)
 | 
						|
                sf.LineAlignment=StringAlignment.Center;
 | 
						|
            else if ((format & eTextFormat.Bottom) == eTextFormat.Bottom)
 | 
						|
                sf.LineAlignment=StringAlignment.Far;
 | 
						|
 | 
						|
            if ((format & eTextFormat.EndEllipsis) == eTextFormat.EndEllipsis)
 | 
						|
                sf.Trimming = StringTrimming.EllipsisCharacter;
 | 
						|
            else
 | 
						|
                sf.Trimming = StringTrimming.Character;
 | 
						|
 | 
						|
            if ((format & eTextFormat.HidePrefix) == eTextFormat.HidePrefix)
 | 
						|
                sf.HotkeyPrefix = HotkeyPrefix.Hide;
 | 
						|
            else if ((format & eTextFormat.NoPrefix) == eTextFormat.NoPrefix)
 | 
						|
                sf.HotkeyPrefix = HotkeyPrefix.None;
 | 
						|
            else
 | 
						|
                sf.HotkeyPrefix = HotkeyPrefix.Show;
 | 
						|
 | 
						|
            if ((format & eTextFormat.WordBreak) == eTextFormat.WordBreak)
 | 
						|
                sf.FormatFlags = sf.FormatFlags & ~(sf.FormatFlags & StringFormatFlags.NoWrap);
 | 
						|
            else
 | 
						|
                sf.FormatFlags |= StringFormatFlags.NoWrap;
 | 
						|
				
 | 
						|
			if ((format & eTextFormat.LeftAndRightPadding) == eTextFormat.LeftAndRightPadding)
 | 
						|
                sf.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
 | 
						|
 | 
						|
            if ((format & eTextFormat.RightToLeft) == eTextFormat.RightToLeft)
 | 
						|
                sf.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
 | 
						|
 | 
						|
            if ((format & eTextFormat.Vertical) == eTextFormat.Vertical)
 | 
						|
                sf.FormatFlags |= StringFormatFlags.DirectionVertical;
 | 
						|
 | 
						|
            if ((format & eTextFormat.NoClipping) == eTextFormat.NoClipping)
 | 
						|
                sf.FormatFlags |= StringFormatFlags.NoClip;
 | 
						|
 | 
						|
            _CachedFormats.Add(format, sf);
 | 
						|
 | 
						|
            return sf;
 | 
						|
        }
 | 
						|
#if DOTNETBAR
 | 
						|
        public static ThemeTextFormat GetTextFormat(eTextFormat format)
 | 
						|
        {
 | 
						|
            ThemeTextFormat ttf = ThemeTextFormat.Left;
 | 
						|
            if (format == eTextFormat.Default)
 | 
						|
                return ttf;
 | 
						|
 | 
						|
            if ((format & eTextFormat.HorizontalCenter) == eTextFormat.HorizontalCenter)
 | 
						|
                ttf |= ThemeTextFormat.Center;
 | 
						|
            else if ((format & eTextFormat.Right) == eTextFormat.Right)
 | 
						|
                ttf|= ThemeTextFormat.Right;
 | 
						|
            if ((format & eTextFormat.VerticalCenter) == eTextFormat.VerticalCenter)
 | 
						|
                ttf |= ThemeTextFormat.VCenter;
 | 
						|
            else if ((format & eTextFormat.Bottom) == eTextFormat.Bottom)
 | 
						|
                ttf |= ThemeTextFormat.Bottom;
 | 
						|
 | 
						|
            if ((format & eTextFormat.EndEllipsis) == eTextFormat.EndEllipsis)
 | 
						|
                ttf |= ThemeTextFormat.EndEllipsis;
 | 
						|
 | 
						|
            if ((format & eTextFormat.HidePrefix) == eTextFormat.HidePrefix)
 | 
						|
                ttf |= ThemeTextFormat.HidePrefix;
 | 
						|
            else if ((format & eTextFormat.NoPrefix) == eTextFormat.NoPrefix)
 | 
						|
                ttf |= ThemeTextFormat.NoPrefix;
 | 
						|
 | 
						|
            if ((format & eTextFormat.WordBreak) == eTextFormat.WordBreak)
 | 
						|
                ttf |= ThemeTextFormat.WordBreak;
 | 
						|
            else
 | 
						|
                ttf |= ThemeTextFormat.SingleLine;
 | 
						|
 | 
						|
            if ((format & eTextFormat.RightToLeft) == eTextFormat.RightToLeft)
 | 
						|
                ttf |= ThemeTextFormat.RtlReading;
 | 
						|
 | 
						|
            if ((format & eTextFormat.NoClipping) == eTextFormat.NoClipping)
 | 
						|
                ttf |= ThemeTextFormat.NoClip;
 | 
						|
 | 
						|
            return ttf;
 | 
						|
        }
 | 
						|
#endif
 | 
						|
    }
 | 
						|
 | 
						|
    [Flags]
 | 
						|
    public enum eTextFormat
 | 
						|
    {
 | 
						|
        Bottom = 8,
 | 
						|
        Default = 0,
 | 
						|
        EndEllipsis = 0x8000,
 | 
						|
        ExpandTabs = 0x40,
 | 
						|
        ExternalLeading = 0x200,
 | 
						|
        GlyphOverhangPadding = 0,
 | 
						|
        HidePrefix = 0x100000,
 | 
						|
        HorizontalCenter = 1,
 | 
						|
        Internal = 0x1000,
 | 
						|
        Left = 0,
 | 
						|
        LeftAndRightPadding = 0x20000000,
 | 
						|
        ModifyString = 0x10000,
 | 
						|
        NoClipping = 0x100,
 | 
						|
        NoFullWidthCharacterBreak = 0x80000,
 | 
						|
        NoPadding = 0x10000000,
 | 
						|
        NoPrefix = 0x800,
 | 
						|
        PathEllipsis = 0x4000,
 | 
						|
        PrefixOnly = 0x200000,
 | 
						|
        PreserveGraphicsClipping = 0x1000000,
 | 
						|
        PreserveGraphicsTranslateTransform = 0x2000000,
 | 
						|
        Right = 2,
 | 
						|
        RightToLeft = 0x20000,
 | 
						|
        SingleLine = 0x20,
 | 
						|
        TextBoxControl = 0x2000,
 | 
						|
        Top = 0,
 | 
						|
        VerticalCenter = 4,
 | 
						|
        WordBreak = 0x10,
 | 
						|
        WordEllipsis = 0x40000,
 | 
						|
        Vertical = 0x40000000
 | 
						|
    }
 | 
						|
}
 |