Click here to Skip to main content
15,867,686 members
Articles / Programming Languages / Visual Basic
Article

Embedding Icons In Your VB.NET Application

Rate me:
Please Sign up or sign in to vote.
4.81/5 (65 votes)
13 Jun 20034 min read 329K   115   45
How to embed and use icons in your application, so you don't have to keep them as separate files.

Introduction

There are lots of ways to add graphics and other non-code (a.k.a. resource) files to your projects. I went looking for a way to embed some icons in my application without having them as separate files--I wanted them to be stored in the .exe itself. I learned how to do what I was looking for, and I picked up a couple other tricks along the way.

50 ways to leave your icon

There are a number of ways to add icons to your application for use with controls like NotifyIcon (the control that puts an icon in your system tray). The NotifyIcon lets you specify a default icon, for example. You just tell it the file name of your icon, and it adds it to your project, hidden away with the control. But what happens if you want to change the icon in your NotifyIcon during runtime? Where do you put those icons?

Well, I did some research on this site and Google, and I found a few ways of doing it. The first is to simply store the icons as separate files associated with your project, and then use code like this to refer to get the icon for use in your application:

VB
Dim objIcon As New Icon("c:\myicon.ico")

The trouble with this technique is that you have to be careful to keep the icon in the proper path associated with your application. It's a little work, and I figured there must be a more elegant solution. I had noticed that many apps keep their many icons in the app itself, so my search continued with that in mind.

What I found next was a way to embed the icons in an application through the use of an ImageList control, which is basically a collection of bitmaps. You add the graphics via the ImageList control at design-time and you can refer to each image by index number at run-time. But, since these images are stored as bitmaps, you must change the image from a Bitmap to an Icon before it may be used as an icon with your NotifyIcon control:

VB
Dim objBitmap As Bitmap
Dim objIcon As Icon
Dim intIndexOfImageIWant As Int16 = 1
objBitmap = New Bitmap(objImageList.Images(intIndexOfImageIWant))
objIcon = System.Drawing.Icon.FromHandle(objBitmap.GetHicon)

Well, that seemed like a pretty good solution, until I realized that an ImageList only stores images as bitmaps at a single resolution. So if I have all these great icons in various sizes that I want to use throughout my application, maybe using their different sizes (since icons have multiple sizes stored within their single file), the ImageList wasn't quite going to cut it.

Next, I discovered talk of the code-Jedi's way of doing things: resource files. These are files that have icons, graphics, and text all embedded in them and ready for your application to use. .NET even stores the info as XML! Cool. But, to create the resources files, you have to get a utility to compile the resource file, and then use some cool code to extract and use what's inside. This way of doing things is useful when you want to localize an application--creating different versions for different languages becomes as easy as swapping out resource files. But, I didn't feel my apps called for that much extra effort, each time I had a few icons to embed. Besides, the goal wasn't to create an extra file with my icons in it, I wanted it in my main exe!

Answer

To embed your icons in your application, drag them into your .NET project. Edit the properties for each one. See the "Build Action" property that's set to "Content"? Change it to "Embedded Resource." That will make it compile into your exe or DLL. That's it! You've just embedded an icon or two into your application. So...how do you get it back out?

With a little love, and a little code:

VB
Function GetEmbeddedIcon(ByVal strName As String) As Icon
    Return New _<BR>Icon(System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(_<BR>     strName))
End Function

The strName parameter is of the format <appNameSpace>.<filenamewithoutextension>.<filenameextension> so, something like MyApplication.MyLogo.ico. It is case sensitive, so watch for that one. If you don't use the name of a resource it can find, you will get an error saying something about a Null.

This code snippet is a great help to find what resources you have available to you:

VB
Function GetListOfEmbeddedResources() As Array
    Return _<BR>     System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceNames
End Function

It caught a couple mis-capitalizations for me that otherwise would have left me with tufts of torn out hair, as I spent fruitless hours trying to figure out why it couldn't find the resource I had so clearly embedded.

Parting shot

Google rocks. CodeProject rocks. Don't know how I managed to code jack before the Internet came along. Enjoy!

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 States United States
Scott is a producer with Electronic Arts in Redwood City and he's an amateur coder.

Comments and Discussions

 
QuestionEasiest way yet... Pin
Code_Addict31-Aug-11 5:03
Code_Addict31-Aug-11 5:03 
GeneralUse Extrenal Icon Pin
FastBurst17-Jun-08 6:33
FastBurst17-Jun-08 6:33 
GeneralThanks Pin
Nasenbaaer3-Mar-08 11:39
Nasenbaaer3-Mar-08 11:39 
GeneralAnother way to embed icons Pin
run6553218-Nov-07 4:30
run6553218-Nov-07 4:30 
GeneralRe: Another way to embed icons Pin
BOBLAiBAM!13-Nov-07 5:27
BOBLAiBAM!13-Nov-07 5:27 
GeneralExtract a byte type file (ie an embeded exe file) Pin
QckSilverDragon17-May-07 17:12
QckSilverDragon17-May-07 17:12 
GeneralYou Da MAN!! Pin
Elvis_Pretzelator2-Jan-07 6:23
Elvis_Pretzelator2-Jan-07 6:23 
GeneralSo how do you do it in VB.Net? (not visual studio) Pin
Thomas Abegglen25-Feb-06 3:49
Thomas Abegglen25-Feb-06 3:49 
GeneralRe: So how do you do it in VB.Net? (not visual studio) Pin
chermisha24-Nov-06 5:46
chermisha24-Nov-06 5:46 
QuestionHow do you determine a NameSpace if one exists Pin
SBendBuckeye5-Jan-06 11:29
SBendBuckeye5-Jan-06 11:29 
GeneralPlay Embedded Wav File Pin
happylobster5-Jan-06 5:43
happylobster5-Jan-06 5:43 
GeneralRe: Play Embedded Wav File Pin
Paul_Williams13-Mar-12 6:40
Paul_Williams13-Mar-12 6:40 
GeneralExtract Embedded Text File Pin
happylobster5-Jan-06 5:20
happylobster5-Jan-06 5:20 
GeneralPerfect! Pin
terpy6-Oct-05 11:43
terpy6-Oct-05 11:43 
GeneralFastest Way Pin
Anonymous18-Mar-05 4:44
Anonymous18-Mar-05 4:44 
GeneralRe: Fastest Way Pin
SBendBuckeye7-Dec-05 5:54
SBendBuckeye7-Dec-05 5:54 
QuestionWhat about Windows accessing icons within your exe Pin
G Computer Network5-Nov-04 12:34
G Computer Network5-Nov-04 12:34 
AnswerRe: What about Windows accessing icons within your exe Pin
Johnny J.11-Jan-11 23:12
professionalJohnny J.11-Jan-11 23:12 
GeneralRe: What about Windows accessing icons within your exe Pin
G Computer Network12-Jan-11 9:41
G Computer Network12-Jan-11 9:41 
GeneralGreat tool Pin
c728319-Mar-04 18:14
c728319-Mar-04 18:14 
GeneralIcon Constructor Overloads Pin
Heath Stewart16-Feb-04 6:07
protectorHeath Stewart16-Feb-04 6:07 
Generalcan't seem to get the embeded icon to work Pin
Namboy825-Feb-04 6:44
Namboy825-Feb-04 6:44 
GeneralRe: can't seem to get the embeded icon to work Pin
skribb8-Nov-05 10:20
skribb8-Nov-05 10:20 
AnswerAnswer Pin
halfazner26-May-07 15:40
halfazner26-May-07 15:40 
QuestionHow do you use an embedded icon library? Pin
MaciejN7-Oct-03 5:15
MaciejN7-Oct-03 5:15 

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.