¿Cómo agregar un icono a una aplicación construida con Eclipse Galileo C y MinGW?

8 minutos de lectura

He leído mucho sobre cómo agregar un ícono a una aplicación creada con Visual Studio, pero no tengo idea de cómo hacerlo con Eclipse Galileo/C/MinGW.

¿Alguien puede escribir una descripción o darme un enlace a una descripción?

avatar de usuario
X y Y

En Windows, los iconos, así como algunos otros elementos (cursores, mapas de bits, …) deben especificarse en un archivo de recursos, que una vez compilado se vinculará al programa.

Primero, un ejemplo sobre cómo agregar un ícono a un programa de Windows que ilustrará su uso dentro de Eclipse. Aquí hay un programa simple que solo crea una ventana, mire el momento en que llenamos el WNDCLASSEX, el ícono de la aplicación está referenciado allí:

recursos.h – este archivo se puede usar para asignar un valor a un identificador de recursos, y así usar el valor en su lugar:

#define AppIcon 101

El siguiente archivo es el archivo de recursos, puede crearlo manualmente o también desde dentro de Eclipse, para crearlo en Eclipse, haga clic derecho en el directorio que desea que sea (en este caso es src) y seleccione New -> File. Allí escriba el nombre que desee y haga clic en Finish. Para editarlo desde dentro de Eclipse, haga clic derecho y seleccione Open with -> Text Editor.

recursos.rc – el icono se especificará aquí:

#include "resources.h"

// The icon path I used will be needed by Eclipse.
// If you want to use back-slashes you have to scape them (\\ instead of \):
AppIcon ICON "../src/icon.ico"

demoicon.c – el archivo que contiene el código del programa:

#include <windows.h>
#include "resources.h"

const char *ClassName = "DemoIcon";

// Declaration of the window procedure, to be used in the WNDCLASSEX struct:
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd) {

    WNDCLASSEX wc;
    HWND hWnd;
    MSG msg;

    // Filling the structure:
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    // Remember this just loads 32x32, use LoadImage() instead for other dimensions (16x16, 48x48, ...):
    wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(AppIcon));
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = ClassName;
    // Here we'll use LoadImage, as we need a 16x16 mini icon:
    wc.hIconSm = LoadImage(hInstance,MAKEINTRESOURCE(AppIcon),IMAGE_ICON,16,16, LR_DEFAULTCOLOR);

    // Registering the class:
    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL,
                   "Could not register window.",
                   "Error",
                   MB_ICONEXCLAMATION | MB_OK);
        return -1;
    }

    // Create the window using the "MainWindow" class:
    hWnd = CreateWindowEx(WS_EX_WINDOWEDGE,
                          ClassName,
                          "Demo Icon",
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          200,
                          150,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    // If the window was not created show error and exit:
    if(hWnd == NULL) {
        MessageBox(NULL,
                   "Could not create window.",
                   "Error",
                   MB_ICONEXCLAMATION | MB_OK);
        return -1;
    }

    // Set the windows show state, to show it:
    ShowWindow(hWnd, nShowCmd);
    // Draw the window:
    UpdateWindow(hWnd);

    // Retrieve messages from the message queue:
    while(GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

// Implementation of the window procedure, will handle the messages:
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

    switch(uMsg) {
        case WM_CLOSE:
            DestroyWindow(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

Ahora, en el directorio fuente de su proyecto Eclipse, asegúrese de tener todos los archivos (en el ejemplo, los 3 archivos mencionados anteriormente y el archivo del icono).

Después de eso ve a Project -> Properties.
ahí, ve a C/C++ Build -> Settings -> Build Steps pestaña.
ahí verás Pre-build steps -> Command. El comando que ingrese allí se ejecutará antes de que comience la compilación, por lo que le indicará que compile el archivo de recursos. Como está utilizando MinGW, el compilador de recursos es windres:

windres ../src/resources.rc -o ../Resources/resources.o

Como puede ver, colocaré el archivo de recursos compilado en un directorio llamado Resourcespuedes dejarlo donde quieras (y así el nombre del archivo, no tiene que ser nombrado resources.rc).

Ahora ve a la Tool Settings pestaña.
ahí, ve a MinGW C Linker -> Miscellaneousy en otros objetos agregue el archivo de objeto creado anteriormente, en este caso debe agregar:

Resources/resources.o

Como se trata de una aplicación de Windows, agregue la opción -mwindows a las banderas del enlazador en la parte superior de la misma pestaña.

Listo, cuando construya su proyecto, Eclipse compilará primero el archivo de recursos y luego vinculará el objeto generado como cualquier otro archivo de objeto de su proyecto.

Espero que sea lo suficientemente claro para leer esto.

  • Hola ! Tengo una pregunta más: ¿Cómo se puede crear un archivo *.rc en Eclipse? Este tipo de archivo no aparece en la lista y cuando creo uno, es solo un archivo de texto sin formato para eclipse. Entonces, ¿debería crear un archivo *.rc de todos modos?

    – Marcus Tik

    12 de septiembre de 2009 a las 7:50

  • Siento haber desmarcado tu respuesta. Se veía tan bien que verifiqué que estaba bien antes de probar la solución (bueno, normalmente no hago esto, pero al leer la solución sabía que me llevaría mucho tiempo intentarlo). Como puede ver en mi primer comentario, tengo problemas con el tipo de archivo rc; parece que en Eclipse este tipo de archivo no existe.

    – Marcus Tik

    12 de septiembre de 2009 a las 9:09

  • Ok, lo siento, debería haber escrito eso también. Para crear un archivo de recursos en Eclipse, puede hacer lo siguiente: haga clic con el botón derecho en el directorio “src” de su proyecto (por ejemplo) y seleccione “Nuevo->Archivo”, en el siguiente cuadro de diálogo, inserte un nombre para él (por ejemplo, icono .rc). Para editar ese archivo desde dentro de Eclipse, haga clic derecho en el archivo y seleccione “Abrir con -> Editor de texto”, debería abrirlo como si fuera otro archivo fuente. No uso Eclipse regularmente, pero me temo que no tendrá resaltado de sintaxis para los archivos de recursos ya que no se reconocen. Editaré la respuesta para agregar esto, ¡gracias!

    – X y Y

    12 de septiembre de 2009 a las 9:59

  • Puede encontrar más información sobre archivos de recursos en el sitio de GoRC (jorgon.freeserve.co.uk/ResourceFrame.htm), que es otro compilador de recursos o en MDSN (msdn.microsoft.com/en-us/library/ms648045(VS.85).aspx). He agregado un ejemplo de LoadImage(), verifique la estructura WNDCLASSEX.

    – X y Y

    12 de septiembre de 2009 a las 10:23

  • Como solución alternativa, puede agregar un ícono en la etapa posterior a la compilación, como se describe aquí: Heaventools.com/command-line_resource_editor.htm

    – Wylder

    21 de diciembre de 2009 a las 22:17

Eclipse no está configurado para buscar archivos de recursos. ERROR. Entonces también tienen pasos para agregarlo al procesamiento. Estos son los pasos para junio. [http://wiki.eclipse.org/CDT/User/FAQ#How_to_handle_Resource-Script-Files_.27.2A.rc.27_with_CDT.3F][1]

¿Cómo manejar Resource-Script-Files ‘*.rc’ con CDT? Actualmente no es posible gestionar windres.exe con CDT. No puede agregar el archivo .rc al proyecto para compilarlo y vincularlo automáticamente. Esto ya está planteado como un error en bugzilla.

Una forma es crear un paso previo a la creación. Bajo el menú Proyecto | Propiedades | C/C++-Compilación | Configuración | Pasos de construcción | Los pasos previos a la compilación completan la línea de comandos: windres –use-temp-file -i..\MyProject.rc -o..\MyProject_rc\MyProject_rc.o Haga que el enlazador conozca el objeto. Bajo el menú Proyecto | Propiedades | C/C++-Compilación | Ajustes Ajustes de la herramienta | Enlazador MinGW C++ | Varios | Otros objetos haga clic en el ícono ‘Agregar’, complete la línea: “C:\MyWorkspace\MyProject\MyProject_rc\MyProject_rc.o” ‘MyWorkspace’ y ‘MyProject’ reemplace con lo que sea adecuado para su propósito.

Debe agregar la carpeta .\MyProject_rc antes de compilar.

Se debe conocer la ruta a windres.exe para eclipsar.

avatar de usuario
Íñigo Selwood

La forma en que lo hice fue mediante la creación de un archivo

icono.rc

#define AppIcon 101
AppIcon ICON "../icon.ico"

Entonces invocar vientos a través del símbolo del sistema con

windres my.rc -O coff -o my.res

Compilará varios archivos para usted; mantenga el que se llama icono.res y cambiarle el nombre como libicon.a. Finalmente, inclúyalo en su programa agregándolo como una biblioteca en

Proyecto -> Propiedades -> Construir -> Configuración -> C++ Linker -> Bibliotecas

(asegúrese de decirle a Eclipse dónde encontrar el archivo usando la sección de rutas de la biblioteca debajo).

¡Espero que esto ayude!

Primero comprimo todos los íconos que quiero usar dentro del proyecto. Luego
Rebautizar el .zip a un .jar

Cree una carpeta de recursos si aún no tiene una (yo uso “lib”). Luego coloque el archivo jar dentro de la carpeta de recursos.

Luego, una simple adición a las propiedades del proyecto:

haciendo clic derecho y Configurar “Java Build Path” – seleccione el Pestaña de bibliotecas. Clickea en el Agregar JAR y agregue el icons.jar a las bibliotecas – luego salvar.

Ahora es fácil asignar el ícono de la imagen deseada dentro del Editor del constructor de ventanas por ejemplo, cuando el frasco que contiene sus íconos aparece dentro del selector de modo de selección de imagen dentro de la lista de recursos de Classpath. Todo funciona como debería y compila bien.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad