Как добавить Icon в приложение, созданное с помощью Eclipse Galileo C и MinGW? - PullRequest
6 голосов
/ 11 сентября 2009

Я много читал о том, как добавить значок в приложение, созданное в Visual Studio, но я не знаю, как это сделать с Eclipse Galileo / C / MinGW.

Может кто-нибудь написать описание или дать ссылку на описание?

Ответы [ 4 ]

15 голосов
/ 12 сентября 2009

В Windows значки, а также некоторые другие элементы (курсоры, растровые изображения, ...) должны указываться в файле ресурсов, который после компиляции будет связан с программой.

Первый пример того, как добавить значок в программу Windows, которая проиллюстрирует его использование в Eclipse. Вот простая программа, которая просто создает окно. Посмотрите, когда мы заполняем WNDCLASSEX, там находится ссылка на значок приложения:

resources.h - этот файл может использоваться для присвоения значения идентификатору ресурса, поэтому вместо него используйте значение:

#define AppIcon 101

Следующий файл - это файл ресурсов, вы можете создать его вручную или из Eclipse, чтобы создать его в Eclipse, щелкнуть правой кнопкой мыши по каталогу, которым вы хотите (в данном случае это src), и выбрать New -> File. Там напишите нужное имя и нажмите Finish. Чтобы отредактировать его из Eclipse, щелкните его правой кнопкой мыши и выберите Open with -> Text Editor.

resources.rc - здесь будет указан значок:

#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 - файл, содержащий код программы:

#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;
}

Теперь, в вашем исходном каталоге проекта Eclipse, убедитесь, что у вас есть все файлы (в примере 3 файла, упомянутых выше, и файл значков).

После этого перейдите к Project -> Properties.
Там перейдите на вкладку C/C++ Build -> Settings -> Build Steps.
Там вы увидите Pre-build steps -> Command. Команда, которую вы там заполните, будет выполнена до начала компиляции, поэтому вы скажете ей скомпилировать файл ресурсов. Поскольку вы используете MinGW, компилятор ресурсов будет windres:

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

Как вы можете видеть, я помещу скомпилированный файл ресурсов в каталог с именем Resources, вы можете оставить его там, где хотите (и поэтому имя файла не обязательно должно называться * 1038). *).

Теперь перейдите на вкладку Tool Settings.
Там перейдите к MinGW C Linker -> Miscellaneous, и в других объектах добавьте созданный ранее объектный файл, в этом случае вы должны добавить:

Resources/resources.o

Поскольку это приложение для Windows, добавьте параметр -mwindows к флагам компоновщика в верхней части той же вкладки.

Готово, при сборке вашего проекта Eclipse сначала скомпилирует файл ресурсов, а затем свяжет сгенерированный объект как любой другой объектный файл вашего проекта.

Надеюсь, это достаточно ясно, чтобы прочитать это.

1 голос
/ 29 августа 2018

Я так и сделал, создав файл

icon.rc

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

Затем вызовите windres через командную строку с

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

Он скомпилирует несколько файлов для вас - оставьте файл с именем icon.res и переименуйте его в libicon.a . Наконец, включите его в свою программу, добавив его как библиотеку в

Проект -> Свойства -> Сборка -> Настройки -> C ++ Linker -> Библиотеки

(убедитесь, что вы указали Eclipse, где найти файл, используя раздел путей к библиотекам внизу).

Надеюсь, это поможет!

1 голос
/ 28 июня 2013

Eclipse не настроен для просмотра файлов ресурсов. BUG. Таким образом, у них также есть шаги, чтобы добавить его к обработке. Вот шаги на июнь. [http://wiki.eclipse.org/CDT/User/FAQ#How_to_handle_Resource-Script-Files_.27.2A.rc.27_with_CDT.3F][1]

Как обрабатывать файлы ресурсов-скриптов '* .rc' с помощью CDT? В настоящее время обработка файла windres.exe с помощью CDT невозможна. Вы не можете добавить файл .rc в проект для автоматической компиляции и связывания с ним. Это уже поднято как ошибка в bugzilla.

Одним из способов является создание шага перед сборкой. Под меню Проект | Свойства | C / C ++ - Сборка | Настройки | Шаги по сборке | Шаги перед сборкой заполните командную строку: windres --use-temp-file -i .. \ MyProject.rc -o .. \ MyProject_rc \ MyProject_rc.o Сделайте объект известным компоновщику. Под меню Проект | Свойства | C / C ++ - Сборка | настройки Настройки инструмента | MinGW C ++ Linker | Разное | Другие объекты нажмите на иконку «Добавить», заполните строку: "C: \ MyWorkspace \ MyProject \ MyProject_rc \ MyProject_rc.o" «MyWorkspace» и «MyProject» заменяют на то, что подходит для ваших целей.

Вы должны добавить папку. \ MyProject_rc перед сборкой.

Путь к windres.exe должен быть известен для затмения.

0 голосов
/ 30 декабря 2014

Сначала я застегиваю все значки, которые хочу использовать в проекте. затем Переименуйте .zip в .jar

Создайте папку ресурсов, если у вас ее еще нет (я использую "lib") Затем поместите файл jar в папку ресурсов.

Тогда одно простое дополнение к свойствам проекта:

, щелкнув правой кнопкой мыши и сконфигурировав «Путь сборки Java» - выберите вкладку Библиотеки . Нажмите кнопку Add JARs и добавьте icons.jar в библиотеки - затем save .

Теперь легко выделить нужный значок изображения в редакторе Window Builder , например, так как банка с вашими иконками появляется в окне выбора режима выбора изображений в списке ресурсов Classpath. Все работает как надо и прекрасно компилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...