visual studio para jpg iconos icon code application c# .net winforms icons

c# - studio - Establecer el mismo icono para todos mis formularios



visual studio code icons (7)

  1. En las propiedades del proyecto> Aplicación> Ícono y manifiesto> busque un archivo * .ico y agréguelo allí.

  2. En el constructor o el evento _Load de un formulario, simplemente agregue:

    this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);

¿Hay alguna forma de establecer el mismo ícono en todos mis formularios sin tener que cambiar uno por uno? Algo así como cuando configura GlobalAssemblyInfo para todos sus proyectos dentro de su solución.


Además de la recomendación de Marc, es posible que desee que sus formularios hereden automáticamente el icono del ensamblaje en ejecución que los contiene / los llama.
Esto se puede hacer agregando el siguiente código a su formulario heredado:

public MyCustomForm() { Icon = GetExecutableIcon(); } public Icon GetExecutableIcon() { IntPtr large; IntPtr small; ExtractIconEx(Application.ExecutablePath, 0, out large, out small, 1); return Icon.FromHandle(small); } [DllImport("Shell32")] public static extern int ExtractIconEx( string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);


Esta es la manera de establecer el mismo icono en todos los formularios sin tener que cambiar uno por uno. Esto es lo que codifiqué en mis aplicaciones.

FormUtils.SetDefaultIcon();

Aquí un ejemplo completo listo para usar.

static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Here it is. FormUtils.SetDefaultIcon(); Application.Run(new Form()); } }

Aquí está la clase FormUtils:

using System.Drawing; public static class FormUtils { public static void SetDefaultIcon() { var icon = Icon.ExtractAssociatedIcon(EntryAssemblyInfo.ExecutablePath); typeof(Form) .GetField("defaultIcon", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static) .SetValue(null, icon); } }

Y aquí la clase EntryAssemblyInfo. Esto está truncado para este ejemplo. Es mi clase codificada personalizada tomada de System.Winforms.Application.

using System.Security; using System.Security.Permissions; using System.Reflection; using System.Diagnostics; public static class EntryAssemblyInfo { private static string _executablePath; public static string ExecutablePath { get { if (_executablePath == null) { PermissionSet permissionSets = new PermissionSet(PermissionState.None); permissionSets.AddPermission(new FileIOPermission(PermissionState.Unrestricted)); permissionSets.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)); permissionSets.Assert(); string uriString = null; var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly == null) uriString = Process.GetCurrentProcess().MainModule.FileName; else uriString = entryAssembly.CodeBase; PermissionSet.RevertAssert(); if (string.IsNullOrWhiteSpace(uriString)) throw new Exception("Can not Get EntryAssembly or Process MainModule FileName"); else { var uri = new Uri(uriString); if (uri.IsFile) _executablePath = string.Concat(uri.LocalPath, Uri.UnescapeDataString(uri.Fragment)); else _executablePath = uri.ToString(); } } return _executablePath; } } }


La alternativa a establecer en el constructor está anulando la propiedad Owner y tomando el icono del formulario de propietario.

public new Form Owner { set { this.Icon = (value == null ? null : value.Icon); base.Owner = value; } get { return base.Owner; } }


No estaba seguro de si quería usar la herencia aquí, así que usé un método de extensión:

public static class MyExtensionMethods { public static void SetAppIcon(this Form form) { form.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); } }

Luego, en el constructor de cualquier forma:

this.SetAppIcon();

Nota: esto causará un bloqueo si intenta ejecutar la aplicación desde una ubicación de red


No estoy seguro si el diseñador de MS VS puede tratar con formularios que no se derivan directamente del formulario. De lo contrario, puede intentar copiar el icono del formulario principal a todos los demás formularios: para cada formulario en la colección de formularios

form.icon = MainFrom.Icon

O tal vez en el evento _Loaded de cada formulario:

Icon = MainFrom.Icon


Una opción sería heredar de una base común: formulario que establece el icono en el constructor (presumiblemente de una resx). Otra opción podría ser PostSharp : parece que debería ser posible hacer esto (configurar .Icon) a través de AOP; no es trivial, sin embargo. Finalmente, puede usar un método de utilidad simple (quizás un método de extensión) para hacer lo mismo.

Lo mejor de todo, con la primera opción, probablemente podrías arriesgar Ctrl + H (reemplazar todo) de : Form o : System.Windows.Forms.Form a : MyCustomForm .