Рассчитать ширину формы Windows для отображаемого текста - PullRequest
1 голос
/ 18 мая 2011

Мне нужно рассчитать ширину формы Windows для отображаемого текста. Ширина формы явно в пикселях, так что вы просто хотите получить ширину текста в пикселях, но это не работает:

animationForm.Width = TextRenderer.MeasureText(_caption, animationForm.Font).Width;

Расчетная ширина формы слишком мала (обрезает текст) - что здесь происходит? MeasureText использует пиксели, ширина формы в пикселях.

Это работает лучше, но я не думаю, что это правильно:

animationForm.Width = (int)(_caption.Length * animationForm.Font.Size);

Помощь будет оценена.

AnimationPic - PictureBox, Надпись установлена ​​на ярлыке

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace PrlSystems.MaimInvoicing.Forms
{
    public partial class ProgressIndicatorForm : Form
    {
        private volatile bool _animating = false;
        private Form _parent;
        private string _caption = "";

        private object _mutex = new object();

        public ProgressIndicatorForm(Form parent)
        {
            InitializeComponent();
            _parent = parent;
        }

        public string Caption
        {
            set { _caption = value; }
            get { return _caption; }
        }

        public void StartAnimation()
        {
            lock (_mutex)
            {
                if (!_animating)
                {
                    if (_parent != null)
                    {
                        _parent.Cursor = Cursors.WaitCursor;
                        _parent.Enabled = false;
                    }

                    _animating = true;
                    _SpawnAnimationThread();
                }
            }
        }

        public void StopAnimation()
        {
            lock (_mutex)
            {
                if (_animating)
                {
                    _animating = false; // stop animation thread

                    if (_parent != null)
                    {
                        // restore parent form UI
                        _parent.Cursor = Cursors.Default;
                        _parent.Enabled = true;
                        _parent.Activate();
                    }
                }
            }
        }

        private void _SpawnAnimationThread()
        {
            Thread animationThread = new Thread(new ThreadStart(_Animate));
            animationThread.Priority = ThreadPriority.Normal;
            animationThread.IsBackground = true;    // should terminate when application ends
            animationThread.Start();
        }

        private void _Animate()
        {
            ProgressIndicatorForm animationForm = new ProgressIndicatorForm(_parent);
            animationForm.CaptionLabel.Text = _caption;
            animationForm.StartPosition = FormStartPosition.CenterScreen;
            animationForm.TopMost = true;
            animationForm.Width = _CalculateFormWidth(animationForm);

            animationForm.Show();

            while (_animating)
            {
                animationForm.CaptionLabel.Text = _caption;
                animationForm.Width = _CalculateFormWidth(animationForm);

                animationForm.BringToFront();
                animationForm.Refresh();
            }
            animationForm.Close();
            animationForm.Dispose();
        }

        private int _CalculateFormWidth(ProgressIndicatorForm animationForm)
        {
            int width = AnimationPic.Location.X + AnimationPic.Width +
                TextRenderer.MeasureText(_caption, animationForm.Font).Width;


            return width;
        }
    }
}

Изображение в конструкторе:

This is how it looks in the designer, the progress dialog

Ответы [ 3 ]

4 голосов
/ 18 мая 2011

Вместо Form.Width вам необходимо использовать Form.ClientSize.Width.

Последний вернет фактическую ширину клиентской области формы;то есть место, где можно рисовать вещи.Из раздела «Примечания» в документации:

Размер клиентской области формы - это размер формы, исключая границы и строку заголовка.Клиентская область формы - это область внутри формы, в которую можно поместить элементы управления.Вы можете использовать это свойство, чтобы получить правильные размеры при выполнении графических операций или при определении размера и расположении элементов управления в форме.Чтобы получить размер всей формы, используйте свойство Size или отдельные свойства Height и Width.

Сравните это с Form.Width (или Form.Size.Width), который возвращает ширину всей формы, как она появляется на экране, включая лишние данные в области, не являющейся клиентом, напримерграницы окна.Определенно не теряйте времени, пытаясь вычислить и удалить размеры для этих элементов вручную;это уже сделано для вас.


Используя следующий код:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    string longStringOfText = "This is a really long string of text we're using for testing purposes.";

    // Resize the form's client area, keeping the same height, but
    // changing the width to match that needed to draw the text.
    this.ClientSize = new Size(TextRenderer.MeasureText(longStringOfText,
                                                        this.Font).Width,
                               ClientSize.Height);

    // Then draw in the text.
    TextRenderer.DrawText(e.Graphics,
                          longStringOfText,
                          this.Font,
                          Point.Empty,
                          Color.Purple);
}

Я получаю это:

Form, with text string correctly fit across it

Взглядыочень хорошо для меня ...

0 голосов
/ 18 мая 2011

Вы пытались указать контекст устройства?Попробуйте этот метод перегрузить MeasureText(IDeviceContext, String, Font, Size).

Когда вы используете Form.Width, ширина содержит также ширину границы окна.Попробуйте это:

animationForm.ClientSize.Width = TextRenderer.MeasureText(_caption, animationForm.Font).Width;
0 голосов
/ 18 мая 2011

Вам также необходимо учесть дополнительные размеры, такие как ширина формы. Пробел вокруг метки (если вы используете метку?)

...