我需要为显示的文本计算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;
}
}
}
设计师中的图片:
答案 0 :(得分:4)
而不是Form.Width
,您需要使用Form.ClientSize.Width
。
后者将返回表单客户区的实际宽度;即,你可以画东西的地方。从文档中的备注部分:
表单客户区的大小是表单的大小,不包括边框和标题栏。表单的客户区域是可以放置控件的表单中的区域。在执行图形操作或在窗体上调整大小和定位控件时,可以使用此属性来获取正确的尺寸。要获得整个表单的大小,请使用
Size
property或使用各个属性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);
}
我明白了:
看起来对我很好......
答案 1 :(得分:0)
您还需要考虑额外的尺寸,例如表格的宽度。标签周围的空间(如果您使用标签?)
答案 2 :(得分:0)
您是否尝试过指定设备上下文?
尝试使用此方法重载MeasureText(IDeviceContext, String, Font, Size)
。
使用Form.Width
时,宽度还包含窗口边框的宽度。试试这个:
animationForm.ClientSize.Width = TextRenderer.MeasureText(_caption, animationForm.Font).Width;