5

我在我的项目中添加了一个 .rc 文件,其中包含以下内容:

IDI_MAIN_ICON          ICON          "..\\..\\icon_artwork\\windows_icons\\project.ico"  

.ico 文件包含 16x16、32x32、48x48 和 256x256 分辨率的图标。

我在任务栏和资源管理器中看到了图标(因此毫无疑问 .ico 已成功嵌入到 .exe 中),但我在应用程序自己的标题栏中和 alt-tab 中看到了默认的 Windows 7 应用程序图标。

有没有办法让操作系统在所有情况下都能自己看到嵌入的图标,还是我需要为此编写一些应用程序代码?我注意到有一个 SDL2 函数

void SDL_SetWindowIcon(SDL_Window*  window, SDL_Surface* icon)  

但这需要一个 SDL 表面,而不是可执行文件中的嵌入式图标资源。

任何想法都非常感谢,
托尼

4

2 回答 2

7

就目前而言,没有。SDL 出于某种原因吃掉了实际应用程序窗口的图标。但是,您可以使用 WINDOWS 特定代码来解决此问题。请记住,这不是便携式的。

#if defined(_WIN32) && defined(GCL_HICON)
void setWindowsIcon(SDL_Window *sdlWindow) {
    HINSTANCE handle = ::GetModuleHandle(nullptr);
    HICON icon = ::LoadIcon(handle, "IDI_MAIN_ICON");
    if(icon != nullptr){
        SDL_SysWMinfo wminfo;
        SDL_VERSION(&wminfo.version);
        if(SDL_GetWindowWMInfo(sdlWindow,&wminfo) == 1){
            HWND hwnd = wminfo.info.win.window;
            ::SetClassLong(hwnd, GCL_HICON, reinterpret_cast<LONG>(icon));
        }
    }
}
#endif
于 2014-11-14T05:04:40.537 回答
4

您应该能够使用从 .png 文件中获取 SDL_Surface

SDL_Surface *IMG_Load(const char *file)

然后将其传递给您的SDL_SetWindowIcon(SDL_Window* window, SDL_Surface* icon)方法。我不认为该IMG_Load(...)方法需要 .ico 文件,但是 32x32 .png 版本的图标将是一个很好的折衷方案......不理想,但我能想到的最好的解决方法;)

于 2013-10-12T15:51:11.257 回答