我已将 .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 图面,而不是可执行文件中的嵌入式图标资源。
任何想法都感激不尽,
托尼
就目前情况而言,没有。由于某种原因,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
您应该能够使用以下方法从 .png 文件获取 SDL_Surface:
SDL_Surface *IMG_Load(const char *file)
然后将其传递给您的
SDL_SetWindowIcon(SDL_Window* window, SDL_Surface* icon)
方法。
我认为 IMG_Load(...)
方法不需要 .ico 文件,但 32x32 .png 版本的图标应该可以工作。