如何使用GTK +作为GUI将图像文件作为图标编译成EXE?

时间:2014-06-09 06:19:21

标签: gtk

我知道如何将图像设置为GtkWindow的图标。

GtkWindow * window;
gtk_window_set_icon_from_file(window, "icon.png", NULL);

并将icon.png与exe。一起放置。

但是,如果我不想将该图像文件保存在我的文件夹中,该怎么办?我想以某种方式捆绑在exe文件中。

我知道这可以在Qt中用qrc完成。我也可以在GTK +中这样做吗?

4 个答案:

答案 0 :(得分:4)

我现在知道该怎么做。

首先,我必须将该图像转换为普通代码。

说我想将icon.png作为图标。

运行此命令将其转换为名为icon_1的变量。如果你没有它,就抓住那个二进制文件。

gdk-pixbuf-csource --raw --name=icon_1 icon.png

它将在命令提示符下显示。但我想你想把它保存到文件中。所以

gdk-pixbuf-csource --raw --name=icon_1 icon.png>icon.c

将在Windows中完成这项工作。

现在可以使用变量icon_1了。

下一步。致电gdk_pixbuf_new_from_inline()以从GdkPixbuf *创建新的icon_1

GdkPixbuf * icon_title = gdk_pixbuf_new_from_inline(-1, icon_1, false, NULL);

现在,您可以使用新创建的gtk_window_set_icon()来调用icon_title来设置窗口的图标。

gtk_window_set_icon(window, icon_title);

还要记住,如果将icon_1保留在独立的C文件中,则必须包含glib.h以便可以编译它,因为它使用类型guint8,并在之前使用该变量使用它可以链接。

更多详情:

https://developer.gnome.org/gdk-pixbuf/unstable/gdk-pixbuf-Image-Data-in-Memory.html#gdk-pixbuf-new-from-inline

答案 1 :(得分:2)

使用GResource

示例.gresource.xml可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<gresources>
    <gresource prefix="/com/example/myapp">
        <file>icon.png</file>
    </gresource>
</gresources>

然后将其编译为C:

glib-compile-resources.exe myapp.gresource.xml --generate-source --target=resources.c

并在您的应用程序源中包含resources.c

然后使用嵌入文件作为窗口图标:

gtk_window_set_icon_from_file (window, "resource:///com/example/myapp/icon.png", NULL);

另外考虑使用gtk_window_set_default_icon_from_file设置图标以将其应用于对话框

答案 2 :(得分:0)

我们对此有点新,并且需要完成基本相同的事情,但是采用了不同的方法。

值得注意的是,将png(s)转换为xpm(s),然后加载/复制&#34; raw xpm(s)&#34;将原始代码作为&#34;变量&#34;,然后在GTK等中使用gdk_pixbuf_new_from_xpm_data()...等等。

这样原始的xpm被编译为代码的一部分,然后它不需要在外部搜索文件等。

这意味着失去了ppm无法支持的某些功能,但它很容易,甚至我们的非IT类型&#34;可以管理它。

这也允许直接访问&#34;图像&#34;因为它可以编辑为&#34; text&#34;在代码中,很容易制作变体和其他图标等,并且可以很容易地实时更改图标/图像&#34;编程。

它也非常便携。例如,我们也在Windows上的Gtk-Fortran中使用它...工作得很漂亮。

答案 3 :(得分:0)

这个问题是相对古老的,但是尽管如此,我还是在搜寻类似问题时偶然发现了它。因此,以下内容可能会有所帮助,这取决于@DrOli的答案,后者描述了一种非常通用的方法。 首先使用ImageMagicks convert将PNG转换为XPM

convert about.png about.xpm

将新文件包含到您的代码中,并以gtkmm方式创建pixbuf

#include <gdkmm/pixbuf.h>
#include "about.xpm"

Glib::RefPtr< Gdk::Pixbuf > logo = Gdk::Pixbuf::create_from_xpm_data(about);

Voila ...