如何将Icon添加到使用Eclipse Galileo C和MinGW构建的应用程序中?

时间:2009-09-11 14:01:10

标签: c eclipse

我已经阅读了很多关于如何向使用Visual Studio构建的应用程序添加图标的内容,但我不知道如何使用Eclipse Galileo / C / MinGW执行此操作。

任何人都可以写一个描述,或者给我一个描述链接吗?

4 个答案:

答案 0 :(得分:15)

在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的目录中,您可以将它保留在您想要的位置(因此文件的名称,不必命名) resources.rc)。

现在转到Tool Settings标签 在那里,转到MinGW C Linker -> Miscellaneous,在其他对象中添加之前创建的对象文件,在这种情况下,您应该添加:

Resources/resources.o

由于这是一个Windows应用程序,请将选项-mwindows添加到同一选项卡顶部的链接器标记。

完成,在构建项目时,Eclipse将首先编译资源文件,然后将生成的对象链接为项目的任何其他目标文件。

我希望能够清楚地了解这一点。

答案 1 :(得分:1)

Eclipse未设置为查看资源文件。 BUG。因此他们也有步骤将其添加到处理中。这是六月的步骤。 [http://wiki.eclipse.org/CDT/User/FAQ#How_to_handle_Resource-Script-Files_.27.2A.rc.27_with_CDT.3F] [1]

如何使用CDT处理Resource-Script-Files'* .rc'? 目前使用CDT处理windres.exe是不可能的。您无法将.rc文件添加到要自动编译和链接的项目中。这已经成为bugzilla中的一个错误。

一种方法是创建预构建步骤。在menue下 项目|属性| C / C ++ - 构建|设置|构建步骤|预建步骤 填写命令行: windres --use-temp-file -i .. \ MyProject.rc -o .. \ MyProject_rc \ MyProject_rc.o 使链接器知道该对象。在menue下 项目|属性| C / C ++ - 构建|设置 工具设置| MinGW C ++链接器|杂项|其他物件 点击“添加”图标,填写以下内容: “C:\ MyWorkspace \ MyProject的\ MyProject_rc \ MyProject_rc.o” “MyWorkspace”和“MyProject”将替换为适合您目的的任何内容。

您必须在构建之前添加文件夹。\ MyProject_rc。

日食必须知道windres.exe的路径。

答案 2 :(得分:1)

我这样做的方法是创建一个文件

icon.rc

// My Page Object class
export class MapperPage {
    ...
    async getProjectNameBreadCrumbText() {
        return await this.breadCrumbs.get(2).getText();
    }
    ...
    async waitAndVerifyProjectNameBreadCrumbs(projectName: string) {
        await browser.wait(async function() {return (await this.getProjectNameBreadCrumbText()).indexOf(projectName) > -1;},
            this.DEFAULT_WAIT_TIME_SECONDS * 1000, 'Name Breadcrumb for this page never loaded.');
        expect(await this.getProjectNameBreadCrumbText()).toContain(projectName);
        expect(await this.getProjectMapperBreadCrumbText()).toEqual(this.MAPPER_BREADCRUMB);
    }
}


// In my test I call the waitAndVerify method like so
...
it('test', async() => {
    const PROJECT_NAME = 'Project Name';
    ... // do other things
    // wait for the page to load by making sure the breadcrumbs have loaded
    await waitAndVerifyProjectNameBreadCrumbs(this.PROJECT_NAME);
});

然后通过命令提示符使用以下命令调用windres

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

它将为您编译多个文件-保留一个名为 icon.res 的文件,并将其重命名为 libicon.a 。最后,通过将其作为库添加到

下,将其包含在您的程序中
  

项目->属性->构建->设置-> C ++链接器->库

(确保使用下面的库路径部分告诉Eclipse在哪里找到文件)。

希望这会有所帮助!

答案 3 :(得分:0)

我首先在项目中压缩我想要使用的所有图标。然后 将.zip重命名为 .jar

如果您还没有资源文件夹,请创建一个资源文件夹(我使用&#34; lib&#34;) 然后将jar文件放在资源文件夹中。

然后对项目属性进行一个简单的添加:

右键单击并配置&#34; Java Build Path&#34; - 选择库选项卡。点击添加JAR 按钮,将icons.jar添加到库中 - 然后保存

现在很容易在 Window Builder编辑器中分配所需的图像图标,例如,包含图标的jar将出现在Classpath资源列表中的Image Selection模式选择器中。一切都按预期工作,编译得很好。