【问题标题】:How to add an Icon to an application built with Eclipse Galileo C and MinGW?如何向使用 Eclipse Galileo C 和 MinGW 构建的应用程序添加图标?
【发布时间】:2010-11-27 12:25:12
【问题描述】:

我已经阅读了很多关于如何将图标添加到使用 Visual Studio 构建的应用程序的内容,但我不知道如何使用 Eclipse Galileo / C / MinGW 来做到这一点。

谁能写一个描述,或者给我一个描述的链接?

【问题讨论】:

    标签: c eclipse


    【解决方案1】:

    在 Windows 中,图标以及其他一些元素(光标、位图等)必须在资源文件中指定,一旦编译将链接到程序。

    首先是一个关于如何将图标添加到 Windows 程序的示例,该示例将说明它在 Eclipse 中的使用。这是一个简单的程序,只是创建了一个窗口,看看我们填充WNDCLASSEX的时候,应用程序的图标是引用到那里的:

    resources.h - 此文件可用于为资源标识符分配值,因此请改用该值:

    #define AppIcon 101
    

    下一个文件是资源文件,你可以手动创建,也可以在Eclipse中创建987654326@。在那里写下你想要的名字,然后点击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 -&gt; Properties
    在那里,转到C/C++ Build -&gt; Settings -&gt; Build Steps 标签。
    在那里你会看到Pre-build steps -&gt; Command。你在那里填写的命令会在编译开始之前执行,所以你会告诉它编译资源文件。当您使用 MinGW 时,资源编译器是 windres:

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

    如您所见,我会将编译后的资源文件放在名为 Resources 的目录中,您可以将其放在您想要的位置(因此文件名不必命名为 @987654337 @)。

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

    Resources/resources.o
    

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

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

    我希望它足够清楚,可以通读。

    【讨论】:

    • 嗨!我还有一个问题:如何在 Eclipse 中创建 *.rc 文件?此文件类型未列出,当我创建一个文件类型时,它只是 eclipse 的纯文本文件。那么我还是应该创建一个 *.rc 文件吗?
    • 很抱歉,我没有选中您的答案。它看起来非常好,在我实际尝试解决方案之前我已经检查它是否正常(通常我不这样做,但我从阅读解决方案中知道我需要很长时间才能尝试它)。正如您从我的第一条评论中看到的那样,我遇到了 rc 文件类型的问题 - 似乎在 Eclipse 中这种文件类型不存在。
    • 好的,对不起,我也应该写的。要在 Eclipse 中创建资源文件,您可以执行以下操作:右键单击项目的“src”目录(例如)并选择“New->File”,在下一个对话框中为其插入一个名称(例如图标.rc)。要在 Eclipse 中编辑该文件,请右键单击该文件并选择“Open with->Text Editor”,它应该像打开另一个源文件一样打开它。我不经常使用 Eclipse,但我担心你不会对资源文件进行语法高亮显示,因为它们无法识别。我将编辑答案以添加此内容,谢谢!
    • 您可以在另一个资源编译器 GoRC (jorgon.freeserve.co.uk/ResourceFrame.htm) 的站点或 MDSN (msdn.microsoft.com/en-us/library/ms648045(VS.85).aspx) 中找到有关资源文件的更多信息。我添加了 LoadImage() 的示例,检查 WNDCLASSEX 结构。
    • 作为一种解决方法,您可以在构建后阶段添加一个图标,如下所述:heaventools.com/command-line_resource_editor.htm
    【解决方案2】:

    Eclipse 未设置为查看资源文件。漏洞。所以他们也有步骤将其添加到处理中。这是六月的步骤。 [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 中的错误提出。

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

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

    eclipse必须知道windres.exe的路径。

    【讨论】:

      【解决方案3】:

      我的做法是创建一个文件

      icon.rc

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

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

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

      它将为您编译几个文件——保留一个名为 icon.res 的文件并将其重命名为 libicon.a。最后通过将其添加为

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

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

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

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

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

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

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

        通过右键单击并配置“Java 构建路径” - 选择 Libraries 选项卡。单击添加 JAR 按钮并将 icons.jar 添加到库中 - 然后保存

        现在可以很容易地在 Window Builder 编辑器 中分配所需的图像图标,例如包含图标的 jar 出现在 Classpath 资源列表中的图像选择模式选择器中。一切正常,并且编译良好。

        【讨论】:

        • 问题是关于c++的。
        猜你喜欢
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 2011-03-09
        • 2018-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多