C# winform如何计算控件上文字的实际宽度(像素)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# winform如何计算控件上文字的实际宽度(像素)相关的知识,希望对你有一定的参考价值。

比如:我想知道TreeView叶节点上文字的宽度,要怎么写代码

C#中GDI+提供了测量文字的具体代码,你可以使用下面的代码:
Graphics g = treeView1.CreateGraphics();
Size size = g.MeasureString();

你把要测量的文字传入MeasureString函数,最后返回的size就是文字的具体尺寸。
参考技术A treeView1.Nodes[0].NodeFont.Size
treeView1.Nodes[0].NodeFont.SizeInPoints
在这两个属性了里取出来

C#,Winform如何做出显示文字没有焦点但是可以复制的效果?类似网页。

通常我都只是用个textbox,做成只读,但是很难看,类似网页上的文字显示是怎么做到的呢?或者.net有无自带的控件可以实现呢?

参考技术A using System.Runtime.InteropServices;//加这个命名空间
namespace SY1


public partial class Form1 : Form

[DllImport("user32.dll", EntryPoint = "HideCaret")]

public static extern bool HideCaret(IntPtr hWnd);//用这个API

public Form1()

InitializeComponent();

private void Form1_Load(object sender, EventArgs e)




private void textBox1_MouseDown(object sender, MouseEventArgs e)

IntPtr hWnd = textBox1.Handle;
HideCaret(hWnd);//获得焦点时调用





然后把TextBox的边框设成None ,改成只读就可以了。
还有一个不用API的变通的办法,
就是你再放一个隐藏的textBox2在form里
然后
private void textBox1_MouseUp(object sender, MouseEventArgs e)

textBox2.Focus();


private void textBox1_MouseClick(object sender, MouseEventArgs e)

textBox2.Focus();

也能达到你说的目的,但不是一个好办法。

另外不明白你为什么不用API现成的方法,而要自己去写。
说白textBox2.Focus()也是API,只不过.net给你封装好了可以直接用罢了。
参考技术B 非常简单,你直接放一个webBrowser1控件,然后
webBrowser1.DocumentText = "just a test";
webBrowser1.ScrollBarsEnabled = false;
就可以了。追问

那我就是问webBrowser的效果是怎么做出来的。

追答

WebBrowser是WinForm的控件之一,直接拉一个控件到WinForm窗体,加上上面的两句代码就可以达到你想要的效果。
其基本原理是把系统自带的IE窗口嵌入到webBrowser控件中,以呈现你所需的页面。
至于IE的解析过程,本身是极其复杂的,只不过它被优化到效率特别快而已。

追问

我没有说解析过程,只是想知道那种可以复制又没有焦点的文本是怎么实现。

追答

你的问题不是问.net有没自带控件可以实现么?WebBrowser就是.net的自带控件。
如果你非要自己写一个控件去实现这个功能的话,新建一个继承自System.Windows.Forms.Control的类。
使用MouseUp事件、MouseDown事件确定选择的起点和终点。
如果单用这两个事件的话,点击控件并移到控件之外放开鼠标会有bug,使用MouseEnter事件、MouseLeave事件可以解决这个问题。
重写OnPaint方法呈现选择(或者未被选择)的文本。

追问

麻烦你写个来看看?

追答

写这个太浪费时间了,因为它的实现一点也不轻松。
真有兴趣的话你可以自己写,遇到技术难题可以问我。
使用Graphics.MeasureString可以测量每个字符的大小,以便于确定选择的起点与终点。
说句难听点的,如果我给你提示你都实现不了,那么我写出来你也看不懂。

追问

那你何必来回答我的问题,我的问题已经问得非常清楚了,需要你说这么多废话吗?

追答

你的问题里面有一句“或者.net有无自带的控件可以实现呢?”
我以为只要有一个可以实现你需要的功能的控件就足够了,天知道你还想要源代码。
大概实现方式我已经告诉你了,再附赠一个小例子:
public class MyControl : Control

protected override void OnPaint(PaintEventArgs e)

e.Graphics.DrawString("这是一个测试", this.Font, new SolidBrush(this.ForeColor), new PointF(0, 0));


编译以后,它是一个可以直接放到WinForm上面的控件,它的效果是显示“这是一个测试”这样一行字。
你可以先使用e.Graphics.DrawRectangle绘制一个纯色背景,再在背景上绘制文字,那样就是选择的效果,至于绘制的坐标就需要你自己的计算了。
如果你还不满意,那我也没办法了。

追问

你这个是啥例子啊,以为我不懂基本的GDI+?

追答

那我就实在想不通了。
既然你对GDI+很熟悉的话,那么写这样一个控件对你来说应该是轻而易举的事情,你又何必让别人写源代码给你?
还是说你认为你花费了200积分,就应该获得一份别人写好的源代码?

追问

你不想写就不要回答,我问问题是我的自由,你管得着?

追答

回答问题,只是偶尔的无聊帮别人解答一下困惑而已。
有句话叫授之与鱼不如授之与渔,个人觉得,能够告诉别人一个实现的方向已经足够了。
如果对方遇到技术问题自然是要尽量想办法解决的,我也说过,如果你遇到技术难题可以再问我。
不过刚看了下,发现你的技术还是相当强大的,你回答的问题,比我还要多的多,应该足以实现你想要的控件了。
如果你是想用200分找免费劳力的话,我想应该没有人会愿意的吧,毕竟200积分大概1-4块钱就能买到。

参考技术C using System.Runtime.InteropServices;//加这个命名空间
namespace SY1


public partial class Form1 : Form

[DllImport("user32.dll", EntryPoint = "HideCaret")]

public static extern bool HideCaret(IntPtr hWnd);//用这个API

public Form1()

InitializeComponent();

private void Form1_Load(object sender, EventArgs e)




private void textBox1_MouseDown(object sender, MouseEventArgs e)

IntPtr hWnd = textBox1.Handle;
HideCaret(hWnd);//获得焦点时调用





然后把TextBox的边框设成None ,改成只读就可以了。
不谢~追问

请看我另外一个追问,虽然说你会用这个api说明你确实很厉害,但是我已经说了不要用api来修改textbox了,最好是继承自control的控件。

追答

还有一个不用API的变通的办法,
就是你再放一个隐藏的textBox2在form里
然后
private void textBox1_MouseUp(object sender, MouseEventArgs e)

textBox2.Focus();


private void textBox1_MouseClick(object sender, MouseEventArgs e)

textBox2.Focus();

也能达到你说的目的,但不是一个好办法。

另外不明白你为什么不用API现成的方法,而要自己去写。
说白textBox2.Focus()也是API,只不过.net给你封装好了可以直接用罢了。

追问

谢谢你写了这么多,因为我觉得网页上的文字应该不是用一个很大的textbox装着的或者是隐藏了一个,从浏览器的开发者角度来说应该是个小问题,难道C#就不能弄出这种效果?

追答

整个网页其实就是一个文本
HTML = 超文本标记语言。这个名字不是没有意义的!

参考技术D Form_Load 事件中,FORM并没有展现出来,只是加载相应的资源和组件。此时组件仍不可见,所以Focus事件不会生效。可以在 Shown 事件 或者 Actived 事件里,设置 focus 第5个回答  2013-09-25 lable 是可以做到复制的。。我给你写了一个demo 可以发给你看下。QQ: 953954891

以上是关于C# winform如何计算控件上文字的实际宽度(像素)的主要内容,如果未能解决你的问题,请参考以下文章

c# winform groupbox上动态生成的控件,如何让控件随着分辨率变化而自动调整位置和大小

c#中winform中combobox中文本居中

c# winform groupbox上动态生成的控件,如何让控件随着分辨率变化而自动调整位置和大小

C# 窗体中如何居中label标签??有没有属性可以设置?

C# winform 编程 自定义combobx控件,将treeview控件嵌入combobox中

c#开发winform程序,如何做等待窗体?等待窗体上面只有个一gif图片和文字,读取完成后等待窗体关闭。