程序启动的时候左上角的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种方式:
-
在每个操作系统中,替换Icon是应用程序级别的事情,调用操作系统提供的API就能做到,实际上和Unigine本身无关.所以如果你用了MFC,WPF, QT等外围UI库封装使用Unigine完全可以直接调用外围App程级的方法操作.
-
那如果纯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);