如何用C#实现Word里的字体选择下拉列表框

XuCaishen 2009-10-19 02:48:09
第一步,新建一个默认的C#项目,相信大家一步大家都会了,我就不重复了。
第二步,在窗体上添加一个ComboBox控件。修改ComboBox的name属性为cboFont;修改DrawMode属性为第三项OwnerDrawVariable,此项的属性的意思是:ComboBox列表框的内容为手工绘制且高度不等。
第三步,在public class里编写以下代码:
private System.Drawing.Text.InstalledFontCollection objFont =new System.Drawing.Text.InstalledFontCollection();
注:这一句代码作用是引入系统中安装的字体;

第四步,双击窗体,进入窗体的Load事件,在Load事件中编写以下代码:
foreach (System.Drawing.FontFamily i in objFont.Families)
{
cboFont.Items.Add(i.Name.ToString());
}
cboFont.SelectedIndex=0;
//注:遍列系统中的字体,添加字体进ComboBox控件,设置默认选择为第一项

第五步:因为我们在第二步里设置ComboBox的绘制方法为手工绘制且高度不等,那么在绘制之前,我们需要先设置第一项的高度,所以我们就用到了MeasureItem属性。在列表属性里选择事件列表,然后双击MeasureItem事件,然后在该事件里写以下代码:
System.Drawing.Font objFonts =new Font(cboFont.Items[e.Index].ToString(),14);
e.ItemHeight=objFonts.Height;
//注:因为每个字体的样式不同,所以高度也是不同的,每当我们往comboBox控件里添加一项字体的时候就要重新计算一次将要添加字体的高度;

第六步:设置完高度以后,我们就要开始绘制字体了。在DrawItem事件(同添加MeasureItem事件的步骤一样)里添加以下代码:
System.Drawing.Font objFonts=new Font(cboFont.Items[e.Index].ToString(),14);
e.DrawBackground();
e.Graphics.DrawString(cboFont.Items[e.Index].ToString(),objFonts,new SolidBrush(e.ForeColor),new Point(e.Bounds.Left,e.Bounds.Top));
//注:同MeasureItem事件一样,我们需要先设置字体的样式。然后重绘背景,为什么需要重绘背景呢?每当窗体刷新一新,那么comboBox控件就会重新绘新一遍字体,如果不重绘背景,就会出现字体重影。然后我们使用Gragpics属性里的Drawstring方法绘制,这里有几个参数,第一个参数是:要绘制的字体;第二个参数是:要绘制的字体样式,这里我们用刚才定义的objFonts;第三个参数是:使用哪一种刷子来绘制,在这里我们使用纯色刷子,使用的颜色为ComboBox的前景色。第四个参数就是要从哪个位置开始绘制了。

然后,保存,运行程序,我们就可以看到Word里的字体选择下拉列表框的效果了。

-------------------------------------------------------------------------------------------------

忘了从哪里看来的,测试了一下,发现一个问题:字体“Berlin Sans FB Demi”不支持样式“Regular”。
应该是某些字体不支持当前的字体样式,但不知道怎么解决。
大家有兴趣的一起测试一下,尝试解决。
...全文
734 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_donghui 2010-08-08
  • 打赏
  • 举报
回复
请问怎么反编译一下FontDialog.
lnwuyaowei 2009-10-19
  • 打赏
  • 举报
回复
建议反编译一下FontDialog.
anzhiqiang_touzi 2009-10-19
  • 打赏
  • 举报
回复
sasaew
XuCaishen 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 rabbitlzx 的回复:]
为啥不用。net里的FontDialog?
[/Quote]

FontDialog弹出一个对话,有时候用下拉框更加方便和美观,所以要尝试多种方法。
rabbitlzx 2009-10-19
  • 打赏
  • 举报
回复
为啥不用。net里的FontDialog?

110,536

社区成员

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

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

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