如何准确获取字符宽

CraxyMouse 2009-09-21 12:45:02
我现在在写一个控件要实现AutoSize功能,
用了系统自带的graphics.MeasureString和
TextRenderer.MeasureText
得到的字符串的宽都比实际的小的?
有什么方法可以精确的获取字符串的宽?
...全文
530 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2009-09-22
  • 打赏
  • 举报
回复
用TextRenderer.MeasureText,字体从控件中取。
xinghuanonline 2009-09-22
  • 打赏
  • 举报
回复
up
lzsh0622 2009-09-22
  • 打赏
  • 举报
回复
我用过的取得字符串的准确宽度的方法,稍做修改,还可以取得DataGridView中的列中的显示宽度。

//返回字符宽度: controlName-显示控件 font-显示字体 str-显示的字符串
private int GetWidth(String controlName,Font font, String str)
{
int width = -1;
switch (controlName)
{
case "Button":
{
Button btn = new Button();
btn.Font = font;
btn.Text = str;
btn.AutoSize = true;
btn.Visible = false;
this.Controls.Add(btn);
width = btn.Width;
btn.Dispose();
break;
}
case "Label":
{
Label lbl = new Label();
lbl.Font = font;
lbl.Text = str;
lbl.AutoSize = true;
lbl.Visible = false;
this.Controls.Add(lbl);
width = lbl.Width;
lbl.Dispose();
break;
}

// case "...": 这里还可以扩展其它控件,或者找一个接近的代替。
}
return width;
}

// 测试用代码
private void button8_Click(object sender, EventArgs e)
{
Font font = new Font("Verdana", 9, FontStyle.Regular);

MessageBox.Show("Label(中123) 宽:" + GetWidth("Label", "中123", font).ToString());
MessageBox.Show("Button(中123) 宽:" + GetWidth("Button", "中123", font).ToString());
}
lzsh0622 2009-09-22
  • 打赏
  • 举报
回复
楼主要测试字符在哪个控件中的宽度? 或者是要用哪个控件显示你的字符串?
鸭梨山大帝 2009-09-21
  • 打赏
  • 举报
回复
GDI
这个跟屏幕分辨率有关系的,楼主是否考虑了显示器的分辨率?
对此不甚了解,等待dylike来解决... ...
CraxyMouse 2009-09-21
  • 打赏
  • 举报
回复
我写了一个条码设计的程序

我要获取输入文本的宽来写一个类似label功能的控件

[Quote=引用 33 楼 hdhai9451 的回复:]
引用楼主 dunao 的回复:
我现在在写一个控件要实现AutoSize功能,
用了系统自带的graphics.MeasureString和
TextRenderer.MeasureText
得到的字符串的宽都比实际的小的?
有什么方法可以精确的获取字符串的宽?



不知道楼主想获取这个宽的用意是什么?

[/Quote]
lethwei 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 hdhai9451 的回复:]
引用楼主 dunao 的回复:
我现在在写一个控件要实现AutoSize功能,
用了系统自带的graphics.MeasureString和
TextRenderer.MeasureText
得到的字符串的宽都比实际的小的?
有什么方法可以精确的获取字符串的宽?



不知道楼主想获取这个宽的用意是什么?

[/Quote]
获得宽度, 才能设置自动换行, 调整空间大小之类的啊
我以前也碰到这个问题, 一直无法获取精确宽度, 所以调整出来的文字格式总是不好, 郁闷
Andy__Huang 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 dunao 的回复:]
我现在在写一个控件要实现AutoSize功能,
用了系统自带的graphics.MeasureString和
TextRenderer.MeasureText
得到的字符串的宽都比实际的小的?
有什么方法可以精确的获取字符串的宽?

[/Quote]

不知道楼主想获取这个宽的用意是什么?
lzsh0622 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 dunao 的回复:]
我目前就是这个来完成的
不知道它是怎么实现的

MeasureString用这个函数特别是有中文+英文等情况计算出来的都是不准确的,


引用 9 楼 flyingdragon168 的回复:
設置一個Label控件的AutoSize為True,當你把你設置到你控件上的文本內容同時給此Label控件,Label的寬度,就基本上是你控件需要的寬度。這種方法比較簡單,不需要考慮其它特殊因素.

[/Quote]

这种方法,只能用于同种控件做参照。如: label 和label , TextBox 和 TextBox ,Cell之间,

同种字体,同种内容 label 与 TextBox 的显示宽度不同
xinghuanonline 2009-09-21
  • 打赏
  • 举报
回复
up
CraxyMouse 2009-09-21
  • 打赏
  • 举报
回复
我目前就是这个来完成的
不知道它是怎么实现的

MeasureString用这个函数特别是有中文+英文等情况计算出来的都是不准确的,


[Quote=引用 9 楼 flyingdragon168 的回复:]
設置一個Label控件的AutoSize為True,當你把你設置到你控件上的文本內容同時給此Label控件,Label的寬度,就基本上是你控件需要的寬度。這種方法比較簡單,不需要考慮其它特殊因素.
[/Quote]
zzxap 2009-09-21
  • 打赏
  • 举报
回复
小多少?少一就加一
aimeast 2009-09-21
  • 打赏
  • 举报
回复
太棒了!
CraxyMouse 2009-09-21
  • 打赏
  • 举报
回复
在有中文和英文的情况下,
字体用的是Verdana
字符串长一些的话误差就比较大了

不知道label控件是怎么实现的!
hjx398 2009-09-21
  • 打赏
  • 举报
回复
学习
wuyq11 2009-09-21
  • 打赏
  • 举报
回复
Brush foreBrush = Brushes.Blue;
Font font = new Font("幼圆", Convert.ToInt16(40), FontStyle.Regular);
Graphics g = this.CreateGraphics();
string text = "";
SizeF size = g.MeasureString(text, font);
Single posX = (this.Width - Convert.ToInt16(size.Width)) / 2;
Single posY = (this.Height - Convert.ToInt16(size.Height)) / 2;
g.TranslateTransform(posX, posY);
g.DrawString(text, font, foreBrush, 0, 0);
banana_97 2009-09-21
  • 打赏
  • 举报
回复
学习
surlew 2009-09-21
  • 打赏
  • 举报
回复
学习
deyter 2009-09-21
  • 打赏
  • 举报
回复
学习
加载更多回复(23)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧