Click here to Skip to main content
15,894,224 members
Articles / Multimedia / GDI+

Customizable Tree Control with Animation Support

Rate me:
Please Sign up or sign in to vote.
4.72/5 (17 votes)
8 Apr 2008CPOL4 min read 108.1K   23   115  
A tree control implementation, allowing complete customization and animation support
/////////////////////////////////////////////////////////////////////////////
//
// (c) 2007 BinaryComponents Ltd.  All Rights Reserved.
//
// http://www.binarycomponents.com/
//
/////////////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace BinaryComponents.WinFormsUtility.Factories
{
	public abstract class IconBuilder : IDisposable
	{
		protected IconBuilder()
		{
		}

		public Icon GetIcon( params string[] keys )
		{
			if( keys == null )
			{
				throw new ArgumentNullException( "keys" );
			}
			if( keys.Length < 1 )
			{
				throw new ArgumentException( "Must supply at least one icon key.", "keys" );
			}

			string compositeKey = string.Join( ",", keys );

			if( !_icons.ContainsKey( compositeKey ) )
			{
				Build( keys );
			}

			return _icons[compositeKey];
		}

		public Image GetImage( params string[] keys )
		{
			if( keys == null )
			{
				throw new ArgumentNullException( "keys" );
			}
			if( keys.Length < 1 )
			{
				throw new ArgumentException( "Must supply at least one icon key.", "keys" );
			}

			string compositeKey = string.Join( ",", keys );

			if( !_images.ContainsKey( compositeKey ) )
			{
				Build( keys );
			}

			return _images[compositeKey];
		}

		private void Build( params string[] keys )
		{
			string compositeKey = string.Join( ",", keys );
			Icon icon = LoadIcon( keys[0] );

			Bitmap bitmap = new Bitmap( icon.Width, icon.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb );

			using( Graphics g = Graphics.FromImage( bitmap ) )
			{
				foreach( string key in keys )
				{
					icon = LoadIcon( key );

					g.DrawIcon( icon, 0, 0 );
				}
			}

			icon = Icon.FromHandle( bitmap.GetHicon() );

			_icons.Add( compositeKey, icon );
			_images.Add( compositeKey, bitmap );
		}

		#region IDisposable Members

		public void Dispose()
		{
			if( _icons != null )
			{
				foreach( Icon icon in _icons.Values )
				{
					Utility.Win32.User.DestroyIcon( icon.Handle );
				}
				_icons = null;
			}
		}

		#endregion

		protected abstract Icon LoadIcon( string key );

		private Dictionary<string, Icon> _icons = new Dictionary<string, Icon>();
		private Dictionary<string, Image> _images = new Dictionary<string, Image>();
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
United Kingdom United Kingdom
I'm currently working for a small start-up company, BinaryComponents Ltd, producing the FeedGhost RSS reader.

FeedGhost RSS Reader:
http://www.feedghost.com

Bespoke Software Development
http://www.binarycomponents.com

Comments and Discussions