System.Drawing.Graphics.MeasureString C# (CSharp) Метод

MeasureString() публичный Метод

public MeasureString ( string textg, Font font, RectangleF rect ) : SizeF
textg string
font Font
rect RectangleF
Результат SizeF
        public SizeF MeasureString(string textg, Font font, RectangleF rect)
        {
            // As per documentation
            // https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_text/dq_text.html#//apple_ref/doc/uid/TP30001066-CH213-TPXREF101
            //
            // * Note * Not sure if we should save off the graphic state, set context transform to identity
            //  and restore state to do the measurement.  Something to be looked into.
            //			context.TextPosition = rect.Location;
            //			var startPos = context.TextPosition;
            //			context.SelectFont ( font.nativeFont.PostScriptName,
            //			                    font.SizeInPoints,
            //			                    CGTextEncoding.MacRoman);
            //			context.SetTextDrawingMode(CGTextDrawingMode.Invisible);
            //
            //			context.SetCharacterSpacing(1);
            //			var textMatrix = CGAffineTransform.MakeScale(1f,-1f);
            //			context.TextMatrix = textMatrix;
            //
            //			context.ShowTextAtPoint(rect.X, rect.Y, textg, textg.Length);
            //			var endPos = context.TextPosition;
            //
            //			var measure = new SizeF(endPos.X - startPos.X, font.nativeFont.CapHeightMetric);

            var atts = buildAttributedString(textg, font);

            var measure = SizeF.Empty;
            // Calculate the lines
            int start = 0;
            int length = (int)atts.Length;

            var typesetter = new CTTypesetter(atts);

            while (start < length) {
                int count = (int)typesetter.SuggestLineBreak (start, 8388608);
                var line = typesetter.GetLine (new NSRange(start, count));

                // Create and initialize some values from the bounds.
                nfloat ascent;
                nfloat descent;
                nfloat leading;
                var lineWidth = line.GetTypographicBounds (out ascent, out descent, out leading);

                measure.Height += (float)Math.Ceiling (ascent + descent + leading + 1); // +1 matches best to CTFramesetter's behavior
                if (lineWidth > measure.Width)
                    measure.Width = (float)lineWidth;

                line.Dispose ();
                start += count;
            }

            return measure;
        }

Same methods

Graphics::MeasureString ( string text, Font font ) : SizeF
Graphics::MeasureString ( string text, Font font, PointF point, StringFormat stringFormat ) : SizeF
Graphics::MeasureString ( string textg, Font font, SizeF layoutArea ) : SizeF
Graphics::MeasureString ( string text, Font font, SizeF layoutArea, StringFormat stringFormat ) : SizeF
Graphics::MeasureString ( string text, Font font, SizeF layoutArea, StringFormat stringFormat, int &charactersFitted, int &linesFilled ) : SizeF
Graphics::MeasureString ( string textg, Font font, int width ) : SizeF
Graphics::MeasureString ( string text, Font font, int width, StringFormat format ) : SizeF

Usage Example

        public override void Draw(Graphics g, Pen p)
        {
            base.Draw(g, p);

            var r = this.RectangleF;

            var sText = g.MeasureString(this.ColouredPlace.ColorSetName, new Font("Arial", 8));
            g.FillRectangle(Brushes.Gray, r.Right, r.Top - sText.Height, sText.Width, sText.Height);

            g.DrawString(
                this.ColouredPlace.ColorSetName,
                new Font("Arial", 8),
                Brushes.Blue,
                r.Right,
                r.Top - sText.Height
            );

            var tokensString = this.ColouredPlace.Tokens.ToString();
            var f = new Font("", 7);
            sText = g.MeasureString(tokensString, f);

            g.FillRectangle(Brushes.Green, r.Right, r.Bottom, sText.Width, sText.Height);
            g.DrawString(
                tokensString,
                new Font("", 7),
                Brushes.Black,
                r.Right,
                r.Bottom
            );
        }
All Usage Examples Of System.Drawing.Graphics::MeasureString