Unigine中修改启动程序左上角的Icon

160 阅读2分钟

程序启动的时候左上角的Icon默认是显示Unigine的,那问题是这个内容存放在哪里呢?

你虽然可以在data/core/gui/icon.png 这个位置找到看上去是的文件,但实际上不是.修改后没有作用.

  • 解密

真正的icon被Unigine的resource.exe 工具处理成二进制数据后以资源文件的形式存放在源代码文件夹中,编译Unigine源代码的时候被直接写入二进制DLL中. 其具体位置在engine/gui/resources/icon.resource 文件中.

在引擎内部加载Icon的代码是这样的.

unsigned char *icon_data = Resource::load(icon_resource, icon_size);

Image icon(icon_data, icon_size);

if (icon.isLoaded() && icon.getFormat() == Image::FORMAT_RGBA8)

engine.app->setIcon(icon.getPixels2D(), icon.getWidth());

delete[] icon_data;

上述代码中:

icon_resource就是从icon.resource文件中读取到的二进制对象,其实质上是一个二进制字符串数组指针

Image是内部封装对象,可以对应外部的Unigine::Image类对象.调用getPixels2D方法得到char*

  • 小提示

我们看到有些试用版本的UnigineSDK中显示的水印内容,其实质上也是这样处理的。这样可以确保资源完全无法被替换掉。从而达到保护的目的。

实际上分析上述代码后,我们发现其和外部的方法调用有相似的地方.

那么如何在App外部调用代码修改Icon呢?有2种方式:

  1. 在每个操作系统中,替换Icon是应用程序级别的事情,调用操作系统提供的API就能做到,实际上和Unigine本身无关.所以如果你用了MFC,WPF, QT等外围UI库封装使用Unigine完全可以直接调用外围App程级的方法操作.

  2. 那如果纯windows console程序,同时又没有直接使用.rc 文件,也还是想操作Unigine维持的App的Icon怎么修改呢?

首先,创建Unigine::Image对象,读取到一个图像文件,这里可以是png文件

其次,调用image类的getPixels2D函数获取到char* 数据

然后,调用Unigine::App::SetIcon(const char* data)的函数,将内容设置进去即可。

如下代码示例:

Unigine::ImagePtr icon = Unigine::Image::create("../bin/icon.png"); Unigine::App::get()->setIcon(icon->getPixels(), 64);