Click here to Skip to main content
15,888,521 members
Articles / Desktop Programming / Windows Forms
Article

Font ListBox and ComboBox Controls with Top 5 Favourite Feature

Rate me:
Please Sign up or sign in to vote.
3.38/5 (7 votes)
17 Jun 20052 min read 58.6K   828   32   2
These controls show a list of fonts installed and displays them in the actual font. This also has a top 5 favourite feature just like Office.

Sample Image - FontListBox_ComboBox_Screenshot.gif

Introduction

This control replicates the Office Font drop down box, with the feature of having your top five recently selected fonts.

Background

I started this control a while back as a ListBox control and after overcoming several problems I converted it to a ComboBox by copying most of the code in one go in a few minutes. Two controls for the price of one!

Using the code

There is only one property that really needs setting and that's the Image setting. This image is the TT, TrueType image included in the package - this is actually a fudge because I didn't have the time (read as: couldn't be bothered) to get the Resource Manager to work nicely in VS 2003, but in VS 2005 it's simple. You've also got the MaximumFavourites property which sets how many fonts you are going to show in the Favourite section, set at a default of 5. And a NonReadableFonts which is just a list of fonts found on my PC that don't display readable text, add yours as you go along.

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

Points of Interest

Damn this code was tricky, trying to get the favourite feature to work nicely, but when the control was finished I looked back at it and it seems pretty simple, just a case of understanding the logic.

I have a collection which has a list of the favourites which is updated in the OnSelectedIndexChanged event. It sees if the newly selected font is in the Favourites, if it is then moves it to the top of the list, if it isn't then adds it, removing other favourite fonts if the count is over the maximum limit.

C#
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();
}

If the font is unreadable then I use Tahoma as a default font to write the name and then try and write the name of the font in it's actual font type, usually displaying images.

The ItemHeight in the ListBox or ComboBox has a 3 added to the value to allow for drawing the Favourite separator, otherwise the text would be clipped at the bottom.

Known Issues

Due to the designer always getting the fonts at design time, the Items collection would grow and grow and grow! So I put in a hack to get the Design Mode to work in this instance (as I am not using ComponentModel, the design mode won't work) and not generate the font list until the control is actually running in runtime.

Selecting a font that is added to the Favourite section means that the selection frame isn't quite right. Also selecting a font will not return you to the top of the list.

History

  • Uploaded Visual Studio 2005 Beta 2 - 17 June 2005.
  • Uploaded Visual Studio 2003 - 17 June 2005.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Generalsuggested change to OnSelectedIndexChanged Pin
DogSpots23-Jun-05 19:17
DogSpots23-Jun-05 19:17 
GeneralRe: suggested change to OnSelectedIndexChanged Pin
DXNuk23-Jun-05 22:12
DXNuk23-Jun-05 22:12 
Bill, thanks for fixing that little bug. Looking at your solution makes me think why I didn't think of that?

This of course then fixes the second bug regarding the selection frame being drawn on the wrong item under the described scenario.

Glad to see your downloading the code and having a look at the article aswell.

Dave

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.