65.9K
CodeProject 正在变化。 阅读更多。
Home

带顶部 5 收藏功能的字体 ListBox 和 ComboBox 控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.38/5 (7投票s)

2005年6月17日

2分钟阅读

viewsIcon

59401

downloadIcon

836

这些控件显示已安装的字体列表,并以实际字体显示它们。它还具有类似于 Office 的前 5 个最喜爱功能。

Sample Image - FontListBox_ComboBox_Screenshot.gif

引言

此控件复制了 Office 字体下拉框,具有显示您最近选择的五个最喜爱字体的功能。

背景

我最初将此控件作为 ListBox 控件启动,在克服了几个问题后,我通过一次性复制大部分代码在几分钟内将其转换为 ComboBox。一个价钱,两个控件!

使用代码

只有一个属性真正需要设置,那就是 Image 设置。此图像是软件包中包含的 TT,TrueType 图像 - 这实际上是一种变通方法,因为我没有时间(可以理解为:懒得)让资源管理器在 VS 2003 中正常工作,但在 VS 2005 中它很简单。您还有 MaximumFavourites 属性,用于设置要在“最喜爱”部分中显示的字体数量,默认为 5。还有一个 NonReadableFonts,它只是我在我的电脑上找到的不显示可读文本的字体列表,您可以随时添加您的字体。

fontListBox1.MaximumFavourites = 5;
fontListBox1.NonReadableFonts = new string[] {
        "Webdings",
        "Wingdings",
        "Wingdings 2",
        "Wingdings 3"};

关注点

该死的,这段代码太棘手了,试图让最喜爱的功能正常工作,但是当控件完成后,我回头看了一下,它似乎很简单,只是了解逻辑的问题。

我有一个集合,其中包含一个最喜爱字体列表,该列表在 OnSelectedIndexChanged 事件中更新。它会查看新选择的字体是否在“最喜爱”列表中,如果在,则将其移动到列表顶部,如果不在,则将其添加进去,如果计数超过最大限制,则删除其他最喜爱字体。

protected override void OnSelectedIndexChanged(EventArgs e)
{
  base.OnSelectedIndexChanged(e);
  string fontName = this.Text;
  if (fontName == "") { return; }
  int indexOf = favourites.IndexOf(fontName);
  if (indexOf == -1)
  {
    if (maxFavourites > favourites.Count)
    {
      // Insert new
      favourites.Insert(0, fontName);
      this.Items.Insert(0, fontName);
    }
    else
    {
      // Don't add any new fonts - replace instead
      favourites.RemoveAt(maxFavourites - 1);
      favourites.Insert(0, fontName);
      this.Items.RemoveAt(maxFavourites - 1);
      this.Items.Insert(0, fontName);
    }
  }
  else
  {
    // Move existing arount
    if (favourites.Count > 1)
    {
      favourites.RemoveAt(indexOf);
      favourites.Insert(0, fontName);
      this.Items.RemoveAt(indexOf);
      this.Items.Insert(0, fontName);
    }
  }
  this.EndUpdate();
}

如果字体不可读,那么我使用 Tahoma 作为默认字体来书写名称,然后尝试以其实际字体类型书写字体名称,通常显示图像。

ListBox 或 ComboBox 中的 ItemHeight 在该值上加了 3,以允许绘制“最喜爱”分隔符,否则文本将在底部被剪切。

已知问题

由于设计器总是在设计时获取字体,因此 Items 集合会越来越大! 因此,我进行了一些破解,使设计模式在这种情况下可以工作(因为我没有使用 ComponentModel,所以设计模式将无法工作),并且在控件实际在运行时运行之前不生成字体列表。

选择添加到“最喜爱”部分的字体意味着选择框不太正确。 此外,选择字体不会将您返回到列表的顶部。

历史

  • 上传了 Visual Studio 2005 Beta 2 - 2005 年 6 月 17 日。
  • 上传了 Visual Studio 2003 - 2005 年 6 月 17 日。
© . All rights reserved.