Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change Default Winform Icon Across Entire App

Can I change the default icon used on a Winform?

Most of my forms have their icon property set to a custom icon. For the few forms that slip through the cracks, I don't want the generic "hey look, he made this in visual studio" icon.

One solution is to tediously check every one of my forms to make sure they either have a custom icon set or have ShowIcon set to False.

Another solution is to have every one of my forms inherit from a base class that sets a custom icon in the constructor.

Aside from those solutions, what other options do I have?

EDIT: I was hoping there would be a way to replace the source of the stock icon with my own. Is it in a resource file somewhere? Or is it embedded in a .NET dll that I can't (or really, really shouldn't) modify?

BOUNTY EDIT: Is there a way to accomplish this without editing or writing a single line of code? I don't care how impractical, complicated, waste-of-time the solution is... I just want to know if it's possible. I need to satisfy my curiosity.

like image 570
Kyle Gagnet Avatar asked Aug 05 '09 14:08

Kyle Gagnet


People also ask

How do I change the default icon in Visual Studio?

On the menu bar, choose Project > Properties. When the Project Designer appears, choose the Application tab. (Visual Basic)—In the Icon list, choose an icon (. ico) file.

How do I change the default exe icon in C# Windows application?

With a project selected in Solution Explorer, on the Project menu, click Properties. Select the Application pane. Select Browse from the Icon drop-down list and browse to the location of the icon file that you want.

How do I add icons to setup file?

Right click on you windows application project, select properties. In the properties window, select the application tab. In the application tab, there is a radio button saying Icon and manifest. Select that and browse and select your custom icon for the application in the Icon drop down menu.


3 Answers

The default icon is embedded in the winforms dll - looking at reflector (DefaultIcon) it is:

defaultIcon = new Icon(typeof(Form), "wfc.ico");

There is no magic in there that checks another common location, so you can't do it without changing code.

You could always embrace the forces of darkness with field-based reflection? Note: this is hacky and brittle. On your own head! But it works:

[STAThread]
static void Main() {
    // pure evil
    typeof(Form).GetField("defaultIcon",
            BindingFlags.NonPublic | BindingFlags.Static)
        .SetValue(null, SystemIcons.Shield);

    // all forms now default to a shield
    using (Form form = new Form()) {
        Application.Run(form);
    }
}

To do it properly; two common options;

  • a base Form class which has the icon set
  • a factory Form method - perhaps something like:

code:

public static T CreateForm<T>() where T : Form, new() {
    T frm = new T();
    frm.Icon = ...
    // any other common code
    return frm;
}

Then instead of:

using(var frm = new MySpecificForm()) {
    // common init code
}

Something like:

using(var frm = Utils.CreateForm<MySpecificForm>()) {

}

Of course - that isn't much prettier! Another option might be a C# 3.0 extension method, perhaps as a fluent API:

public static T CommonInit<T>(this T form) where T : Form {
    if(form != null) {
        form.Icon = ...
        //etc
    }
    return form;
}

and

using(var frm = new MySpecificForm().CommonInit()) {
    // ready to use
}

This is then just a .CommonInit() away from your existing code.

like image 130
Marc Gravell Avatar answered Oct 09 '22 01:10

Marc Gravell


The base class option is the one that we use.

If you are looking for an alternative (not necessarily good ones), you could: 1. Use IOC to instantiate all of your forms and modify the IOC container to set the application icon. 2. Use AOP to insert code into all of the forms that sets the application icon.

Personally, I'd just use the base class...

like image 29
ConsultUtah Avatar answered Oct 09 '22 01:10

ConsultUtah


My useful answer:

No

Would be a nice feature for microsoft to implement though, since most apps use the same icon across the entire application.

like image 2
Jage Avatar answered Oct 09 '22 01:10

Jage